【问题标题】:Summing rows based on cumsum values根据 cumsum 值对行求和
【发布时间】:2017-08-30 08:50:45
【问题描述】:

我有一个类似的数据框

索引  A B C
0    4 7 9
1     2 6 2
2     6 9 1
3     7 2 4
4     8 5 6

我想根据 C 列的总和创建另一个数据框。但这里的问题是,如果 C 的总和达到 10 或更高,它应该创建另一行。像这样。

索引  A B C
0     6 13 11
1     21 16 11

任何帮助都将不胜感激。有没有一种强大的方法可以做到这一点,或者迭代是我最后的手段?

【问题讨论】:

  • 桌子有多大?在这样的情况下,我通常使用 for 循环编写代价高昂的函数,可能是嵌套的。但我也想知道更有效的方法:) 它看起来像这样:为 suma、sumb 和 sumc 创建变量,遍历所有行。如果 c 的总和大于 10,则写入列表,然后重置总和的变量并将新结果附加为新列表。最后,制作列表列表的数据框并返回。
  • 其实表很大,这个过程需要定期运行。这就是为什么我要超越迭代。

标签: python pandas dataframe cumsum


【解决方案1】:

有一种非迭代方法。您需要一个基于C % 11groupby

# Groupby logic - https://stackoverflow.com/a/45959831/4909087
out = df.groupby((df.C.cumsum() % 10).diff().shift().lt(0).cumsum(), as_index=0).agg('sum')
print(out) 
    A   B   C
0   6  13  11
1  21  16  11

【讨论】:

  • 谢谢。这个工作,但只是调整一下,因为问题说 10 或更高所以修改代码一点。 out=df.groupby((df.C.cumsum()-10).shift(1).ge(0).cumsum(), as_index=False).agg('sum')。这应该有效。将其标记为答案。
  • @AafaqZahid 嗯,我没有正确阅读这个问题。我已经修改了我认为更适合一般情况的答案。无论如何,我很高兴知道它有效。感谢您的澄清。
【解决方案2】:

代码如下所示:

import pandas as pd

lista = [4, 7, 10, 11, 7]
listb= [7, 8, 2, 5, 9]
listc = [9, 2, 1, 4, 6]

df = pd.DataFrame({'A': lista, 'B': listb, 'C': listc})

def sumsc(df):
    suma=0
    sumb=0
    sumc=0
    list_of_sums = []
    for i in range(len(df)):
        suma+=df.iloc[i,0]
        sumb+=df.iloc[i,1]
        sumc+=df.iloc[i,2]
        if sumc > 10:
            list_of_sums.append([suma, sumb, sumc])
            suma=0
            sumb=0
            sumc=0
    return pd.DataFrame(list_of_sums)

sumsc(df)

    0   1   2
0  11  15  11
1  28  16  11

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 2014-05-07
    • 2014-08-11
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多