web-dev-qa-db-fra.com

Python Pandas Comment sélectionner des lignes avec une ou plusieurs NULL dans un DataFrame sans lister explicitement les colonnes?

J'ai un dataframe avec environ 300K lignes et ~ 40 colonnes. Je veux savoir si des lignes contiennent des valeurs NULL - et placer ces lignes 'NULL' dans un cadre de données distinct afin que je puisse les explorer facilement.

Je peux créer un masque explicitement:

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

Ou je peux faire quelque chose comme:

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

Y a-t-il une manière plus élégante de le faire (localiser des lignes avec des zéros)?

183
Lev Selector

[Mise à jour pour s'adapter à la pandas moderne, qui utilise isnull comme méthode de DataFrames ..]

Vous pouvez utiliser isnull et any pour construire une série booléenne et l'utiliser pour indexer dans votre cadre:

>>> 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

[Pour les anciens pandas:]

Vous pouvez utiliser la fonction isnull à la place de la méthode:

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

menant au plutôt compact:

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)]

alors quand vous en avez besoin, vous pouvez taper:

nans(your_dataframe)
46
Roko Mijic