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?

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

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']


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 .


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


1
Bisher einfachste Lösung. Einfach und doch mächtig!
Cesare Iurlaro


3

Sie können diesen Code auch verwenden:

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

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.