wake-up-neo.net

Python Pandas Wie wählt man Zeilen mit einer oder mehreren Nullen aus einem DataFrame aus, ohne Spalten explizit aufzulisten?

Ich habe einen Datenrahmen mit ~ 300 KB Zeilen und ~ 40 Spalten. Ich möchte herausfinden, ob Zeilen Nullwerte enthalten - und diese Nullzeilen in einem separaten Datenrahmen ablegen, damit ich sie leicht untersuchen kann.

Ich kann eine Maske explizit erstellen:

mask=False
for col in df.columns: mask = mask | df[col].isnull()
dfnulls = df[mask]

Oder ich kann etwas machen wie:

df.ix[df.index[(df.T == np.nan).sum() > 1]]

Gibt es eine elegantere Art, dies zu tun (Zeilen mit Nullen darin zu lokalisieren)?

183
Lev Selector

[Aktualisiert, um sich an moderne pandas anzupassen, die isnull als Methode von DataFrames hat.]

Sie können isnull und any verwenden, um eine Boolesche Reihe zu erstellen und diese zu verwenden, um einen Index in Ihrem Frame zu erstellen:

>>> df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)])
>>> df.isnull()
       0      1      2
0  False  False  False
1  False   True  False
2  False  False   True
3  False  False  False
4  False  False  False
>>> df.isnull().any(axis=1)
0    False
1     True
2     True
3    False
4    False
dtype: bool
>>> df[df.isnull().any(axis=1)]
   0   1   2
1  0 NaN   0
2  0   0 NaN

[Für ältere pandas:]

Sie könnten die Funktion isnull anstelle der Methode verwenden:

In [56]: df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)])

In [57]: df
Out[57]: 
   0   1   2
0  0   1   2
1  0 NaN   0
2  0   0 NaN
3  0   1   2
4  0   1   2

In [58]: pd.isnull(df)
Out[58]: 
       0      1      2
0  False  False  False
1  False   True  False
2  False  False   True
3  False  False  False
4  False  False  False

In [59]: pd.isnull(df).any(axis=1)
Out[59]: 
0    False
1     True
2     True
3    False
4    False

was zu dem eher kompakten führt:

In [60]: df[pd.isnull(df).any(axis=1)]
Out[60]: 
   0   1   2
1  0 NaN   0
2  0   0 NaN
314
DSM
nans = lambda df: df[df.isnull().any(axis=1)]

wann immer Sie es brauchen, können Sie Folgendes eingeben:

nans(your_dataframe)
46
Roko Mijic