web-dev-qa-db-de.com

Pandas: Suchspalte, deren Name eine bestimmte Zeichenfolge enthält

Ich habe also ein Datenfeld mit Spaltennamen, und ich möchte das finden, das eine bestimmte Zeichenfolge enthält, aber nicht genau übereinstimmt. Ich suche nach 'spike' in Spaltennamen wie 'spike-2', 'hey spike', 'spiked-in' (der 'spike'-Teil ist immer fortlaufend). 

Ich möchte, dass der Spaltenname als Zeichenfolge oder Variable zurückgegeben wird. Daher greife ich wie üblich später mit df['name'] oder df[name] auf die Spalte zu. Ich habe versucht, Wege zu finden, ohne Erfolg. Irgendwelche Tipps?

77
erikfas

Durchlaufen Sie einfach DataFrame.columns. Dies ist ein Beispiel, in dem Sie eine Liste mit übereinstimmenden Spaltennamen erhalten:

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)

Ausgabe:

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

Erläuterung:

  1. df.columns gibt eine Liste mit Spaltennamen zurück
  2. [col for col in df.columns if 'spike' in col] durchläuft die Liste df.columns mit der Variablen col und fügt sie der Ergebnisliste hinzu, wenn col'spike' enthält. Diese Syntax ist Listenverständnis

Wenn Sie nur den resultierenden Datensatz mit den übereinstimmenden Spalten haben möchten, können Sie Folgendes tun:

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

Ausgabe:

   spike-2  spiked-in
0        1          7
1        2          8
2        3          9
139
Alvaro Fuentes

Diese Antwort verwendet die DataFrame.filter-Methode, um dies ohne Listenverständnis zu tun:

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)

Wird nur 'spike-2' ausgegeben. Sie können auch Regex verwenden, wie einige Leute in den obigen Kommentaren vorgeschlagen haben:

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

Gibt beide Spalten aus: ['spike-2', 'hey spke']

33
Ben

Sie können auch df.columns[df.columns.str.contains(pat = 'spike')] verwenden.

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)

Dies gibt die Spaltennamen aus: 'spike-2', u'spiked-in'

Mehr über pandas.Series.str.contains .

# select columns containing 'spike'
df.filter(like='spike', axis=1)

Sie können auch den Namen und den regulären Ausdruck auswählen. Siehe: pandas.DataFrame.filter

3
Manny

Sie können diesen Code auch verwenden:

spike_cols =[x for x in df.columns[df.columns.str.contains('spike')]]
0
Yury