Pandy: znajdź kolumnę, której nazwa zawiera określony ciąg znaków

Więc mam ramkę danych z nazwami kolumn i chcę znaleźć tę, która zawiera określony ciąg znaków, ale nie do końca go pasuje. Szukam 'spike' w nazwach kolumn jak 'spike-2', 'hey spike', 'spiked-in' ('spike' część jest zawsze ciągła).

Chcę, aby nazwa kolumny była zwracana jako łańcuch znaków lub zmienna, więc uzyskam dostęp do kolumny później za pomocą df['name'] lub df[name] Jak zwykle. Próbowałem znaleźć sposób, aby to zrobić, bez skutku. Jakieś wskazówki?

Author: Alvaro Fuentes, 2014-01-22

5 answers

Po prostu iteruj DataFrame.columns, Teraz jest to przykład, w którym skończysz z listą nazw kolumn, które pasują:

import pandas as pd

data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]}
df = pd.DataFrame(data)

spike_cols = [col for col in df.columns if 'spike' in col]
print(list(df.columns))
print(spike_cols)

Wyjście:

['hey spke', 'no', 'spike-2', 'spiked-in']
['spike-2', 'spiked-in']

Wyjaśnienie:

  1. df.columns zwraca listę nazw kolumn
  2. [col for col in df.columns if 'spike' in col] iteruje na liście df.columns ze zmienną col i dodaje ją do listy wynikowej, Jeśli col zawiera 'spike'. Składnia ta to rozumienie listy .

Jeśli chcesz tylko Wynikowy zestaw danych z kolumnami ten mecz możesz to zrobić:

df2 = df.filter(regex='spike')
print(df2)

Wyjście:

   spike-2  spiked-in
0        1          7
1        2          8
2        3          9
 118
Author: Alvaro Fuentes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 14:59:06

Ta odpowiedź używa ramki danych.metoda filtrowania, aby to zrobić bez zrozumienia listy:

import pandas as pd

data = {'spike-2': [1,2,3], 'hey spke': [4,5,6]}
df = pd.DataFrame(data)

print(df.filter(like='spike').columns)

Wyświetli tylko 'spike-2'. Możesz również użyć regex, jak niektórzy sugerowali w komentarzach powyżej:

print(df.filter(regex='spike|spke').columns)

Wyświetli obie kolumny: ['spike-2','hey spke']

 24
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:30

Możesz również użyć df.columns[df.columns.str.contains(pat = 'spike')]

data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]}
df = pd.DataFrame(data)

colNames = df.columns[df.columns.str.contains(pat = 'spike')] 

print(colNames)

Wyświetli nazwę kolumny: 'spike-2', u'spiked-in'

Więcej o pandach.Seria.str.zawiera .

 8
Author: Michael James Kali Galarnyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 04:26:45

Możesz również użyć tego kodu:

spike_cols =[x for x in df.columns[df.columns.str.contains('spike')]]
 0
Author: Yury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 13:09:20
# select columns containing 'spike'
df.filter(like='spike', axis=1)

Możesz również wybrać według nazwy, Wyrażenie regularne. Zobacz: pandy.Ramka danych.filtr

 0
Author: Manny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-02 11:40:45