2014-01-22 24 views
48

Also, ich habe ein Datenframe mit Spaltennamen, und ich möchte die eine finden, die 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 kontinuierlich).Pandas: Spalte finden, deren Name eine bestimmte Zeichenfolge enthält

Ich möchte den Spaltennamen als eine Zeichenfolge oder eine Variable zurückgegeben werden, so dass ich die Spalte später mit df['name'] oder df[name] wie normal zugreifen. Ich habe versucht, Wege zu finden, dies zu tun, ohne Erfolg. Irgendwelche Tipps?

Antwort

84

Etwas mehr als DataFrame.columns laufen, jetzt ist dies ein Beispiel, in dem Sie mit einer Liste von Spaltennamen am Ende werden etwas anderes:

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) 

Ausgang:

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

Erläuterung:

  1. df.columns gibt eine Liste der Spaltennamen
  2. zurück
  3. [col for col in df.columns if 'spike' in col] iteriert über die Liste df.columns mit der Variablen col und fügt sie zur Ergebnisliste hinzu, wenn col'spike' enthält. Diese Syntax lautet list comprehension.

Wenn Sie nur die resultierenden Daten mit den Spalten festgelegt, die Sie passen können dies tun:

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

Ausgang:

spike-2 spiked-in 
0  1   7 
1  2   8 
2  3   9 
+0

Das ist genial! Ich verstehe nicht wirklich genau, wie es funktioniert, obwohl es für Python und Pandas immer noch neu ist. Könntest du es vielleicht erklären? – Sajber

+8

Dies ist, was '' DataFrame.filter'' macht FYI (und Sie können eine Regex liefern, wenn Sie wollen) – Jeff

+0

Vielen Dank für die Erklärung! – Sajber

15

This answer verwendet die DataFrame.filter Methode, dies zu tun ohne Listenverständnis:

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, da einige Leute in den Kommentaren oben vorgeschlagen:

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

ausgegeben beiden Spalten: [ 'Spike-2', 'hey SPKE-']

4

Sie können auch df.columns verwenden [ 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) 

Dies wird geben die Spaltennamen: 'Spike-2', u'spiked-in'

Verwandte Themen