【问题标题】:How to delete row based on row above? Python Pandas如何根据上面的行删除行?蟒蛇熊猫
【发布时间】:2015-10-22 20:25:19
【问题描述】:

我有一个如下所示的数据集:

df = pd.DataFrame({'a': [1,1,1, 2, 3, 3, 4], 'b': [1,np.nan, np.nan, 2, 3, np.nan, 4]})

我希望删除下一行中具有 np.nan 的所有行。我不知道如何做到这一点,因为我不知道如何根据其他行删除行。

【问题讨论】:

  • 为什么投反对票?有没有办法根据后面的行删除一行?像查找一样。也许使用'a'有办法使用groupby?

标签: python numpy pandas


【解决方案1】:

您想在下一行中查找所有具有 np.nan 的行。为此使用 shift:

df.shift().isnull()

       a      b
0   True   True
1  False  False
2  False   True
3  False   True
4  False  False
5  False  False
6  False   True

然后您想知道该行中是否有任何东西是 nan,因此您想将其减少为单个布尔掩码。

df.shift().isnull().any(axis=1)

0     True
1    False
2     True
3     True
4    False
5    False
6     True
dtype: bool

然后只需删除列:

df.drop(df.shift().isnull().any(axis=1))

   a   b
2  1 NaN
3  2   2
4  3   3
5  3 NaN
6  4   4

【讨论】:

    【解决方案2】:

    是的,您可以创建一个掩码,通过组合 df.notnulldf.shift 来删除不需要的行:

    notnull = df.notnull().all(axis=1)
    df = df[notnull.shift(-1)]
    

    【讨论】:

    • 谢谢大家!我不知道 df.shift。很有用
    【解决方案3】:

    用 notnull 测试行是否为空:

    In [11]: df.notnull()
    Out[11]:
          a      b
    0  True   True
    1  True  False
    2  True  False
    3  True   True
    4  True   True
    5  True  False
    6  True   True
    
    In [12]: df.notnull().all(1)
    Out[12]:
    0     True
    1    False
    2    False
    3     True
    4     True
    5    False
    6     True
    dtype: bool
    
    In [13]: df[df.notnull().all(1)]
    Out[13]:
       a  b
    0  1  1
    3  2  2
    4  3  3
    6  4  4
    

    你可以下移看看上面的行是否为NaN:

    In [14]: df.notnull().all(1).shift().astype(bool)
    Out[14]:
    0     True
    1     True
    2    False
    3    False
    4     True
    5     True
    6    False
    dtype: bool
    
    In [15]: df[df.notnull().all(1).shift().astype(bool)]
    Out[15]:
       a   b
    0  1   1
    1  1 NaN
    4  3   3
    5  3 NaN
    

    注意:您可以使用shift(-1) 向上移动。

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 2019-01-29
      • 2016-10-16
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2019-04-19
      相关资源
      最近更新 更多