Pandas dropna - 商店掉线

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)


joh*_*ase 5

从以下数据框开始:

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)

您当然可以在自己的较大数据帧上测试这一点,但应该得到相同的答案。