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

Posted

技术标签:

【中文标题】根据条件保留熊猫数据框的上 n 行【英文标题】:Keep upper n rows of a pandas dataframe based on condition 【发布时间】:2019-04-01 02:08:28 【问题描述】:

如何从数据框中删除满足特定条件后的所有行?例如,我有以下数据框:

import pandas as  pd
xEnd=1
yEnd=2
df = pd.DataFrame('x':[1,1,1,2,2,2], 'y':[1,2,3,3,4,3], 'id':[0,1,2,3,4,5])

我将如何获得一个删除最后 4 行并在第 2 行中保留上 2 行的数据框,条件 x=xEndy=yEnd 得到满足。 编辑:应该提到数据框不一定是上升的。也可能是下降的,我仍然想得到上面的。

【问题讨论】:

【参考方案1】:

要对数据帧进行切片直到第一次满足跨 2 个系列的条件,首先计算所需的索引,然后通过 iloc 切片。

您可以通过set_indexisinnp.ndarray.argmax计算指数:

idx = df.set_index(['x', 'y']).isin((xEnd, yEnd)).values.argmax()
res = df.iloc[:idx+1]

print(res)

   x  y  id
0  1  1   0
1  1  2   1

如果您需要更好的性能,请参阅Efficiently return the index of the first value satisfying condition in array。

【讨论】:

效果很好,非常感谢!我去了idx+2,以保留行本身。 @Mauritius,这很奇怪:idx+1 应该这样做(如我的示例)。 你当然是对的!现在编译的时候实现了。我的第一次尝试确实很奇怪,但是idx+1 是正确的。再次感谢您的帮助!【参考方案2】:

不是 100% 确定我理解正确,但您可以像这样过滤您的数据框:

 df[(df.x <= xEnd) & (df.y <= yEnd)]

这会产生数据框:

   id   x   y   
0   0   1   1   
1   1   1   2 

如果 x 和 y 不是严格递增的,并且您想要满足条件的线以上的内容:

 df[df.index <= (df[(df.x == xEnd) & (df.y == yEnd)]).index.tolist()]

【讨论】:

这个例子很好,但是上面的行不小于xEndyEnd。所以我必须以某种方式获取满足条件的行的行索引 (假设 xEnd yEnd 只满足一行) 工作得很好,谢谢!是的,它应该只包含在一行中 我不时收到ValueError: operands could not be broadcast together with shapes (30,) (0,)。你知道这意味着什么吗? @Christian Sloper 大概没有满足yEnd的行。【参考方案3】:

df = df.iloc[[0:yEnd-1],[:]]

只选择前两行并保留所有列并将其放入新的数据框中。 或者你也可以使用同名的变量。

【讨论】:

以上是关于根据条件保留熊猫数据框的上 n 行的主要内容,如果未能解决你的问题,请参考以下文章

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

删除熊猫数据框的前三行

合并数据框以保留所有项目熊猫

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

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

根据熊猫中多列的条件(最大值)替换列中的值