【问题标题】:With pandas filter rows on sum of column在列的总和上使用 pandas 过滤行
【发布时间】:2021-05-15 17:49:00
【问题描述】:

我想根据其中一列的总和标准选择数据框中的行。例如,我想要 B 列之和小于 3 的数据帧第一行的索引:

df = pd.DataFrame({'A':[z, y, x, w], 'B':[1, 1, 1, 1]})

我唯一的解决方案是一个单独的数据框和一个 while 循环:

df2 = pd.DataFrame({'A':[], 'B':[]})
index = 0
while df2['B'].sum() < 3:
    df2 = df2.append(df1.loc[index])
    index += 1

逻辑让我到达我需要的地方,但似乎不必要地低效。有没有人有创造性的方式使用 pandas 根据列的总和条件过滤数据框?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你描述的是一个累积和(cumsum)。

    在循环中将行附加到 DataFrame 是horribly inefficient,因为它在每次迭代时复制整个 DataFrame 只是为了附加少量数据。相反,您应该使用布尔掩码对原始 DataFrame 进行切片;在这种情况下,检查 cumsum 小于 3 的位置。

    df2 = df[df['B'].cumsum().lt(3)]
    
    #   A  B
    #0  z  1
    #1  y  1
    

    df['B'].cumsum()
    #0    1
    #1    2
    #2    3
    #3    4
    
    df['B'].cumsum().lt(3)
    #0     True     <- Slicing with this Boolean Series
    #1     True     <- keeps only these True rows
    #2    False
    #3    False
    

    【讨论】:

    • 太棒了,正是我想要的。我感到胸中的低效率,但无法想出一个方法来切断我回家的路。谢谢!
    • 简短的跟进问题。我将如何添加下一行。假设这代表实物商品,我希望在我的库存中有一些缓冲,在相同的情况下,B 的值为 2,但我还是想包括它,因为我有 50% 的保证金。这是 while 循环很好的地方,我没有看到添加额外行的单行切片解决方案
    • @chic9009 哦,这是个好问题。我现在无法回答这个问题,但我会在一两个小时后有空闲时间跟进。
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2021-08-27
    • 2013-02-07
    • 2021-12-06
    • 1970-01-01
    • 2019-04-01
    • 2021-09-05
    相关资源
    最近更新 更多