【问题标题】:Keep upper n rows of a pandas dataframe based on condition根据条件保留熊猫数据框的上 n 行
【发布时间】: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 得到满足。 编辑:应该提到数据框不一定是上升的。也可能是下降的,我仍然想得到上面的。

【问题讨论】:

    标签: python pandas dataframe indexing filter


    【解决方案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],[:]]

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

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多