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
假设我们希望在col2
和col3
列中保留 带有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笔记】删除DataFrame中特定所在的行或列