2016-05-26 3 views
2

Ich habe einen großen Pandas Datenrahmen [df] mit Hunderten von Spaltennamen. Ich möchte alle Spalten mit über 50% NAN-Werten löschen, aber nur die Spalten, die im Spaltentitel das Wort "test" enthalten. Gibt es eine einfache Möglichkeit, dies zu tun & Vielen Dank für Ihre Hilfe!Drop Spalten mit ähnlichen Namen mit über 50% Nan in Pandas

+1

Könnten Sie Beispiel Datenrahmen bieten? –

+0

Auf diesem DF würden nur test12 und test13 gelöscht: [link] http://i64.tinypic.com/hry2w7.png – JoeyPython

Antwort

4

IIUC können Sie etwas tun:

In [122]: 
df = pd.DataFrame({'test':np.NaN, 'asd':0,'test 1':[0,1,np.NaN,3,4]}) 
df 

Out[122]: 
    asd test test 1 
0 0 NaN  0.0 
1 0 NaN  1.0 
2 0 NaN  NaN 
3 0 NaN  3.0 
4 0 NaN  4.0 

In [138]: 
cols = df.columns[df.columns.str.contains('test')] 
to_remove = cols[df[cols].isnull().sum() > len(df)/2] 
to_remove 

Out[138]: 
Index(['test'], dtype='object') 

In [140]: 
df.drop(to_remove, axis=1) 

Out[140]: 
    asd test 1 
0 0  0.0 
1 0  1.0 
2 0  NaN 
3 0  3.0 
4 0  4.0 

Also erstens wir die Liste der cols erhalten, die 'Test' mit str.contains enthalten:

In [142]: 
df.columns[df.columns.str.contains('test')] 

Out[142]: 
Index(['test', 'test 1'], dtype='object') 

dann testen wir diese Teilmenge für NaN Werte unter Verwendung von [isnull]:

In [143]: 
df[cols].isnull() 

Out[143]: 
    test test 1 
0 True False 
1 True False 
2 True True 
3 True False 
4 True False 

wenn w e sum dies, wandelt es die Booleschen Werte 1 und 0 bis int:

In [145]: 
df[cols].isnull().sum() > len(df)/2 

Out[145]: 
test  True 
test 1 False 
dtype: bool 

Wir können dann:

In [144]: 
df[cols].isnull().sum() 

Out[144]: 
test  5 
test 1 1 
dtype: int64 

wir durch den Vergleich dieser gegen die halbe Länge des df eine boolean Maske erstellen können dann filter dies, um die cols zu fallen:

In [146]: 
cols[df[cols].isnull().sum() > len(df)/2] 

Out[146]: 
Index(['test'], dtype='object') 
+0

Das funktioniert perfekt - vielen Dank! – JoeyPython

+0

Frage nur, ob ein ähnlicher Ansatz verwendet werden kann, um NANs mit 0 (ZERO) zu füllen? – JoeyPython

+0

Sie meinen ['df.fillna (0)'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html)? – EdChum

Verwandte Themen