Suchen Sie eine Spalte, deren Name eine bestimmte Zeichenfolge enthält

137

Ich habe einen Datenrahmen mit Spaltennamen und möchte den finden, der eine bestimmte Zeichenfolge enthält, aber nicht genau mit dieser übereinstimmt. Ich suche 'spike'in Spaltennamen wie 'spike-2', 'hey spike', 'spiked-in'(der 'spike'Teil immer stetig ist).

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

erikfas
quelle

Antworten:

229

Wiederholen Sie DataFrame.columnsdies einfach. Dies ist ein Beispiel, in dem Sie eine Liste mit Spaltennamen erhalten, die übereinstimmen:

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]iteriert df.columnsmit der Variablen über die Liste colund fügt sie der resultierenden Liste hinzu, falls sie colenthält 'spike'. Diese Syntax ist Listenverständnis .

Wenn Sie nur den resultierenden Datensatz mit den übereinstimmenden Spalten 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
Alvaro Fuentes
quelle
1
Das ist großartig! Ich verstehe jedoch nicht genau, wie es funktioniert, da es sowohl für Python als auch für Pandas noch neu ist. Könnten Sie vielleicht erklären?
Erikfas
16
Dies ist, was DataFrame.filterFYI (und Sie können eine Regex liefern, wenn Sie wollen)
Jeff
2
@xndrme Wie würden Sie eine Regex durchführen, um eine bestimmte Spalte auszuschließen , die mit einer Regex übereinstimmt, anstatt sie einzuschließen ?
Dhruv Ghulati
3
@DhruvGhulati Es ist auch möglich, Ihre unerwünschten Spalten wie in zu löschen. Dort erhalten df[df.columns.drop(spike_cols)]Sie eine DataFrameSpalte ohne die Spalten in der Liste, spike_colsdie Sie mit Ihrem unerwünschten regulären Ausdruck erhalten können.
Alvaro Fuentes
1
prägnanter Code:df[[col for col in df.columns if "spike" in col]]
WindChimes
71

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)

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

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

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

Ben
quelle
22

Sie können auch verwenden 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)

Dadurch werden die Spaltennamen ausgegeben: 'spike-2', 'spiked-in'

Mehr über pandas.Series.str.contains .

Michael James Kali Galarnyk
quelle
18
# select columns containing 'spike'
df.filter(like='spike', axis=1)

Sie können auch nach Namen und regulären Ausdrücken auswählen. Siehe: pandas.DataFrame.filter

Manny
quelle
1
Bisher einfachste Lösung. Einfach und doch mächtig!
Cesare Iurlaro
7
df.loc[:,df.columns.str.contains("spike")]
DhanushNayak
quelle
3

Sie können diesen Code auch verwenden:

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

Abrufen des Namens und der Teilmenge basierend auf Start, Enthält und Ende:

# from: /programming/21285380/find-column-whose-name-contains-a-specific-string
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html
# from: https://cmdlinetips.com/2019/04/how-to-select-columns-using-prefix-suffix-of-column-names-in-pandas/
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html




import pandas as pd



data = {'spike_starts': [1,2,3], 'ends_spike_starts': [4,5,6], 'ends_spike': [7,8,9], 'not': [10,11,12]}
df = pd.DataFrame(data)



print("\n")
print("----------------------------------------")
colNames_contains = df.columns[df.columns.str.contains(pat = 'spike')].tolist() 
print("Contains")
print(colNames_contains)



print("\n")
print("----------------------------------------")
colNames_starts = df.columns[df.columns.str.contains(pat = '^spike')].tolist() 
print("Starts")
print(colNames_starts)



print("\n")
print("----------------------------------------")
colNames_ends = df.columns[df.columns.str.contains(pat = 'spike$')].tolist() 
print("Ends")
print(colNames_ends)



print("\n")
print("----------------------------------------")
df_subset_start = df.filter(regex='^spike',axis=1)
print("Starts")
print(df_subset_start)



print("\n")
print("----------------------------------------")
df_subset_contains = df.filter(regex='spike',axis=1)
print("Contains")
print(df_subset_contains)



print("\n")
print("----------------------------------------")
df_subset_ends = df.filter(regex='spike$',axis=1)
print("Ends")
print(df_subset_ends)
vasili111
quelle