Pandas dropna - 存储删除的行

Posted

技术标签:

【中文标题】Pandas dropna - 存储删除的行【英文标题】:Pandas dropna - store dropped rows 【发布时间】:2016-03-21 15:51:37 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

您可以通过使用unary ~ (invert) operator 索引原始DataFrame 来提供NA 空闲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))]

【讨论】:

我真的很喜欢这个问题的解决方案。请注意,- 已被弃用,取而代之的是 ~ 这非常接近我想要实现的目标,但它对我来说并不像我希望的那样工作,因为它提取了na/nan 值,无论该行中是否存在其他值。我只想提取每个值为 na/nan 的行 - 这如何实现? 您可以使用df.dropna(how='all') 来实现这一点。有关更多信息,请参阅熊猫文档pandas.pydata.org/pandas-docs/stable/generated/…【参考方案2】:

我打算发表评论,但我想我会写一个答案,因为它开始变得相当复杂。 从以下数据框开始:

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 的行,一种方法如下:这是基于this post 的答案 p>

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

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

【讨论】:

以上是关于Pandas dropna - 存储删除的行的主要内容,如果未能解决你的问题,请参考以下文章

pandas删除指定列中有空值的行

【pandas笔记】删除DataFrame中特定所在的行或列

pandas小技巧

pandas 处理缺失值[dropna、drop、fillna]

pandas删除缺失数据(pd.dropna()方法)

pandas使用dropna函数删除dataframe中列缺失值的个数大于某一比例阈值的数据列