2017-05-10 14 views
3

Ich brauche Spalten in Pandas zu wählen, die nur numerische Werte in Spaltennamen enthalten, zum Beispiel:finden numerische Spaltennamen in Pandas

df= 
      0  1  2  3  4 window_label next_states  ids 
0  17.0 18.0 16.0 15.0 15.0  ddddd   d  13.0 
1  18.0 16.0 15.0 15.0 16.0  ddddd   d  13.0 
2  16.0 15.0 15.0 16.0 15.0  ddddd   d  13.0 
3  15.0 15.0 16.0 15.0 17.0  ddddd   d  13.0 
4  15.0 16.0 15.0 17.0 NaN  ddddd   d  13.0 

so brauche ich nur die ersten fünf Spalten auszuwählen. Etwas wie:

df[df.columns.isnumeric()] 

EDIT

ich mit der Lösung kam:

digit_column_names = [num for num in list(df.columns) if isinstance(num, (int,float))] 
df_new = df[digit_column_names] 

nicht sehr pythonic oder pandasian, aber es funktioniert.

+1

Versuch 'df._get_numeric_data()' – gobrewers14

+0

@ gobrewers14, versucht, es auch gibt die Spalte "IDs", die unerwünscht ist. –

+2

Ihre Frage ist dann unklar. "Ich muss Spalten in Pandas auswählen, die nur numerische Werte enthalten." 'ids' ist numerisch. – gobrewers14

Antwort

5

df.ids = df.ids.astype('object')  
new_df = df.select_dtypes([np.number]) 


    0  1  2  3  4  
0 17.0 18.0 16.0 15.0 15.0  
1 18.0 16.0 15.0 15.0 16.0  
2 16.0 15.0 15.0 16.0 15.0  
3 15.0 15.0 16.0 15.0 17.0  
4 15.0 16.0 15.0 17.0 NaN  

EDIT Versuchen: Wenn Sie bei der Auswahl der Spaltennamen interessiert sind, die numerisch sind, hier ist etwas, das Sie tun können.

df = pd.DataFrame({0: [1,2], '1': [3,4], 'blah': [5,6], 2: [7,8]}) 
df.columns = pd.to_numeric(df.columns, errors = 'coerce') 
df[df.columns.dropna()] 

Sie erhalten

0.0 1.0 2.0 
0 1 3 7 
1 2 4 8 
+0

danke, aber es wählt auch die allerletzte Spalte mit dem Namen 'ids' aus, wo es nicht sein sollte. –

+1

@ArnoldKlein, dann solltest du die Frage umformulieren (oder besser eine neue öffnen). Diese Antwort beantwortet Ihre Frage perfekt - das ist die idiomatischste Art, __all__ numerische Spalten auszuwählen – MaxU

+1

Die einzige Möglichkeit, die ID nicht einzuschließen, wäre, den Dtyp von ID zu Objekt zu ändern. Pl siehe bearbeiten – Vaishali

1

Hier ist eine Antwort auf die EDIT Teil ist:

i absichtlich eine Mischung aus Spaltennamen als reelle Zahlen und Strings erstellt haben, die in Zahlen umgewandelt werden können :

In [44]: df.columns.tolist() 
Out[44]: [0, 1, 2, 3, '4', 'window_label', 'next_states', 'ids'] 
# NOTE:    ^

können wir pd.to_numeric(..., errors='coerce') Methode verwenden:

In [41]: df.columns[pd.to_numeric(df.columns, errors='coerce').to_series().notnull()] 
Out[41]: Index([0, 1, 2, 3, '4'], dtype='object') 

In [42]: cols = df.columns[pd.to_numeric(df.columns, errors='coerce').to_series().notnull()] 

In [43]: df[cols] 
Out[43]: 
     0  1  2  3  4 
0 17.0 18.0 16.0 15.0 15.0 
1 18.0 16.0 15.0 15.0 16.0 
2 16.0 15.0 15.0 16.0 15.0 
3 15.0 15.0 16.0 15.0 17.0 
4 15.0 16.0 15.0 17.0 NaN 
+0

toll, danke! Lass mich versuchen, wie es funktioniert. –

1

Ich fand another question auf dieser Website, die ziemlich verwandt ist. Ich habe den Code dafür benutzt und ihn auf dein Problem angewendet. Ich warf auch einen Float in die Spaltennamen, um sicherzustellen, dass es mit int und float funktionierte. Es sieht aus wie:

import pandas as pd 

df = pd.DataFrame({0: [17.0, 18, 16, 15, 15], 
        1: [18.0, 16, 15, 15, 16], 
        2.0: [16.0, 15, 15, 16, 15], 
        3: [15.0, 15, 16, 15, 17], 
        4: [15.0, 16, 15, 17, None], 
        'window_label': ['ddddd' for i in range(5)], 
        'next_states': ['d' for i in range(5)], 
        'ids': [13.0 for i in range(5)]}) 

num_cols = [] 
for col in df.columns.values: 
    try: 
     float(col) 
     num_cols.append(col) 
    except ValueError: 
     pass 

print(df[num_cols]) 

und das Ergebnis sieht so aus:

 0  1 2.0  3  4 
0 17.0 18.0 16.0 15.0 15.0 
1 18.0 16.0 15.0 15.0 16.0 
2 16.0 15.0 15.0 16.0 15.0 
3 15.0 15.0 16.0 15.0 17.0 
4 15.0 16.0 15.0 17.0 NaN 

Edit1: Ich habe erkannt, dass Sie den numerischen Bestimmer in einer Generatorfunktion zu halten und haben eine etwas schneller/sicherlich weniger speicherintensiv Art und Weise, das Gleiche zu tun.

ergibt das exakt gleiche Ergebnis wie oben, obwohl es etwas weniger lesbar ist.

0

Wenn Sie nur für numerische Spaltennamen suchen Ich denke, das sollte funktionieren:

df.columns[df.columns.str.isnumeric()] 

oder diese

df.iloc[:,df.columns.str.isnumeric()] 
Verwandte Themen