wes*_*yer 13 python python-3.x pandas
我使用pandas.DataFrame.dropna方法删除包含NaN的行.此函数返回一个排除已删除行的数据框,如文档中所示.
如何将已删除的行的副本存储为单独的数据框?方法是:
mydataframe[pd.isnull(['list', 'of', 'columns'])]
Run Code Online (Sandbox Code Playgroud)
假设dropna被调用,总是保证返回dropna drop相同的行subset=['list', 'of', 'columns']?
anm*_*mol 19
您可以通过使用一元~(反转)运算符索引原始DataFrame来执行此操作,以提供NA自由DataFrame的反转.
na_free = df.dropna()
only_na = df[~df.index.isin(na_free.index)]
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用ufunc实现~.
only_na = df[np.invert(df.index.isin(na_free.index))]
Run Code Online (Sandbox Code Playgroud)
从以下数据框开始:
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
Run Code Online (Sandbox Code Playgroud)
并假设我们希望在列中保留col2带有 Nans 的行,col3实现此目的的一种方法如下:这是基于这篇文章的答案
df.loc[pd.isnull(df[['col2', 'col3']]).any(axis=1)]
col1 col2 col3
0 a b NaN
Run Code Online (Sandbox Code Playgroud)
因此,如果我们在感兴趣的列中删除带有 Nans 的行,这将为我们提供将被删除的行。为了保留列,我们可以运行相同的代码,但使用 a~来反转选择
df.loc[~pd.isnull(df[['col2', 'col3']]).any(axis=1)]
col1 col2 col3
1 NaN c c
2 c d a
Run Code Online (Sandbox Code Playgroud)
这相当于:
df.dropna(subset=['col2', 'col3'])
Run Code Online (Sandbox Code Playgroud)
我们可以测试:
df.dropna(subset=['col2', 'col3']).equals(df.loc[~pd.isnull(df[['col2', 'col3']]).any(axis=1)])
True
Run Code Online (Sandbox Code Playgroud)
您当然可以在自己的较大数据帧上测试这一点,但应该得到相同的答案。