我使用pandas.DataFrame.dropna方法删除包含NaN的行。此函数返回一个排除已删除行的数据框,如文档中所示。
如何将已删除行的副本存储为单独的数据框?是:
mydataframe[pd.isnull(['list', 'of', 'columns'])]
总是保证返回dropna drop的相同行,假设使用subset=['list', 'of', 'columns']
调用dropna?
答案 0 :(得分:17)
您可以使用unary ~
(invert) operator索引原始DataFrame,以获得NA free DataFrame的反转。
na_free = df.dropna()
only_na = df[~df.index.isin(na_free.index)]
另一种选择是使用ufunc implementation of ~
。
only_na = df[np.invert(df.index.isin(na_free.index))]
答案 1 :(得分:3)
我打算发表评论,但我觉得我会写一个答案,因为它开始变得相当复杂。 从以下数据框开始:
import pandas as pd
import numpy as np
df = pd.DataFrame([['a', 'b', np.nan], [np.nan, 'c', 'c'], ['c', 'd', 'a']],
columns=['col1', 'col2', 'col3'])
df
col1 col2 col3
0 a b NaN
1 NaN c c
2 c d a
并说我们希望在列col2
和col3
中保留行包含Nans的一种方法如下:基于来自{的答案{3}}
df.loc[pd.isnull(df[['col2', 'col3']]).any(axis=1)]
col1 col2 col3
0 a b NaN
因此,如果我们在感兴趣的列中删除带有Nans的行,这将为我们提供将被删除的行。为了保留列,我们可以运行相同的代码,但使用~
来反转选择
df.loc[~pd.isnull(df[['col2', 'col3']]).any(axis=1)]
col1 col2 col3
1 NaN c c
2 c d a
这相当于:
df.dropna(subset=['col2', 'col3'])
我们可以测试:
df.dropna(subset=['col2', 'col3']).equals(df.loc[~pd.isnull(df[['col2', 'col3']]).any(axis=1)])
True
您当然可以在自己的大型数据框架上进行测试,但应该得到相同的答案。