根据条件保留熊猫数据框的上 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=xEnd
和 y=yEnd
得到满足。
编辑:应该提到数据框不一定是上升的。也可能是下降的,我仍然想得到上面的。
【问题讨论】:
【参考方案1】:要对数据帧进行切片直到第一次满足跨 2 个系列的条件,首先计算所需的索引,然后通过 iloc
切片。
您可以通过set_index
、isin
和np.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()]
【讨论】:
这个例子很好,但是上面的行不小于xEnd
和yEnd
。所以我必须以某种方式获取满足条件的行的行索引
(假设 xEnd yEnd 只满足一行)
工作得很好,谢谢!是的,它应该只包含在一行中
我不时收到ValueError: operands could not be broadcast together with shapes (30,) (0,)
。你知道这意味着什么吗? @Christian Sloper
大概没有满足yEnd的行。【参考方案3】:
df = df.iloc[[0:yEnd-1],[:]]
只选择前两行并保留所有列并将其放入新的数据框中。 或者你也可以使用同名的变量。
【讨论】:
以上是关于根据条件保留熊猫数据框的上 n 行的主要内容,如果未能解决你的问题,请参考以下文章