Pandas dropna - 商店掉线

时间:2015-12-15 18:01:04

标签: python python-3.x pandas

我使用pandas.DataFrame.dropna方法删除包含NaN的行。此函数返回一个排除已删除行的数据框,如文档中所示。

如何将已删除行的副本存储为单独的数据框?是:

mydataframe[pd.isnull(['list', 'of', 'columns'])]

总是保证返回dropna drop的相同行,假设使用subset=['list', 'of', 'columns']调用dropna?

2 个答案:

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

并说我们希望在列col2col3保留行包含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

您当然可以在自己的大型数据框架上进行测试,但应该得到相同的答案。