如何根据上面的行删除行?蟒蛇熊猫

Posted

技术标签:

【中文标题】如何根据上面的行删除行?蟒蛇熊猫【英文标题】: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? 【参考方案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) 向上移动。

【讨论】:

以上是关于如何根据上面的行删除行?蟒蛇熊猫的主要内容,如果未能解决你的问题,请参考以下文章

如何根据条件表达式从熊猫数据框中删除行[重复]

蟒蛇,熊猫;按列中最常见的值对 Dataframe 行进行排序

根据条件保留熊猫数据框的上 n 行

熊猫如何删除备用行[重复]

你如何删除每组熊猫的某些行[重复]

如何在熊猫数据框的行之间应用多个条件创建目标数据框