在Pandas DataFrame中删除多个行范围

5
如果我们有一个 Pandas DataFrame,例如大小为(100,5),想要通过索引删除多个行范围(不是多个行或行范围,而是多个行范围),有没有一种方法可以在不必循环索引的情况下完成它?
例如,如果我想要删除 Pandas DataFrame df 中索引在 (3, 10), (24, 29) 和 (31, 64) 之间的行,则朴素的方法是:
for pair in [(3, 10), (24, 29), (31, 64)]:
    a, b = pair
    df.drop(df.iloc[a:b].index, inplace=True)

但我希望有一种方法可以一次性删除多个行的范围。

谢谢。


6
这段代码的意思是从数据框(df)中删除行号为3至10、24至29和31至64的所有行。 - sammywemmy
2
当您以这种方式删除行时,首先删除行3:10,然后在更改的数据框中删除行24:29。因此,在原始数据框中,您将删除行3:10和(24 + 7):(29 + 7)。这是预期的行为吗? - V. Ayrat
2
np.r_ 生成在删除发生之前的所有索引。当然,操作者必须说明他想要什么。 - sammywemmy
1
@V.Ayrat的观点可以通过使用loc而不是iloc来解决,然而,np.r_是正确且最有效的方法。 - Sayandip Dutta
我确实想从原始数据框中删除索引(3,10),(24,29)和(31,64)之间的行,而不是像@V.Ayrat提到的那样在修改后的数据框中使用[3:10],然后[24:29]等等。所以在这种情况下,np.r_是最好的选择吗? - sean.han
2个回答

4

我在一个项目中遇到了与@shona类似的问题,针对这个问题,@sammywemmy提供的解决方案df.drop(np.r_[3:10,24:29,31:64])对我非常有效。我可以一次性从原始DataFrame中删除指定范围的行。


欢迎来到 Stack Overflow。这不是一个好的答案,因为你只是参考了其他评论。请考虑写一个真正的答案。为了改善你的回答,请阅读 tour如何撰写好的答案? - ChristianB
1
嗨@ChristianB,感谢您的建议。我明白了,从现在开始我会尽力回答符合这些参数的问题。 - MereDiver

0
制作数据框的一般方法是将要保留的部分连接起来。基本上是它们被删除的反向操作。
df = pd.concat([df.head(3), df.iloc[10:24], df.iloc[29:31], df.iloc[64:-1]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接