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

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

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

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

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

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2022-11-20
      • 2016-02-12
      • 2018-10-31
      • 2019-06-25
      • 2017-01-13
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      相关资源
      最近更新 更多