如何根据上面的行删除行?蟒蛇熊猫
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.notnull
和 df.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)
向上移动。
【讨论】:
以上是关于如何根据上面的行删除行?蟒蛇熊猫的主要内容,如果未能解决你的问题,请参考以下文章