2017-04-26 1 views
1

Ich bekomme ein Datenframe von einer Schnittstelle mit kryptisch benannten Spalten, von denen ich einige Teilstrings kennen, die sich gegenseitig über alle Spalten ausschließen.Get Spaltennamen bestimmter Spalten

Ein vereinfachtes Beispiel sieht wie folgt aus:

df = pandas.DataFrame({'d10432first34sf':[1,2,3],'d10432second34sf':[4,5,6]}) 
df 
    d10432first34sf d10432second34sf 
0    1     4 
1    2     5 
2    3     6 

Da ich die Spalte Teil weiß, ich einzelne Spalten auf folgende Weise zugreifen können:

df.filter(like='first') 
    d10432first34sf 
0    1 
1    2 
2    3 

df.filter(like='second') 
    d10432second34sf 
0     4 
1     5 
2     6 

Aber jetzt muss ich auch bekommen der genaue Spaltenname jeder Spalte, die mir unbekannt sind. Wie kann ich das erreichen?

Antwort

2

hinzufügen .columns:

cols = df.filter(like='first').columns 
print (cols) 
Index(['d10432first34sf'], dtype='object') 

Oder besser boolean indexing mit contains:

cols = df.columns[df.columns.str.contains('first')] 
print (cols) 
Index(['d10432first34sf'], dtype='object') 

Timings sind nicht gleich:

df = pd.DataFrame({'d10432first34sf':[1,2,3],'d10432second34sf':[4,5,6]}) 
df = pd.concat([df]*10000, axis=1).reset_index(drop=True) 
df = pd.concat([df]*1000).reset_index(drop=True) 
df.columns = df.columns + pd.Series(range(10000 * 2)).astype('str') 

print (df.shape) 
(3000, 20000) 

In [267]: %timeit df.filter(like='first').columns 
10 loops, best of 3: 117 ms per loop 

In [268]: %timeit df.columns[df.columns.str.contains('first')] 
100 loops, best of 3: 11.9 ms per loop 
+0

Ich denke, die zweite Methode viel schneller sein wird, größere DataFrames mit vielen __row s__ – MaxU

+1

@MaxU - Gute Idee, ich werde es testen. – jezrael

+1

@MaxU - genau, du hast Recht. – jezrael

Verwandte Themen