Python DataFrame:在达到条件之前的列的累积和,并在新列中返回和

Python DataFrame:在达到条件之前的列的累积和,并在新列中返回和,python,pandas,dataframe,sum,Python,Pandas,Dataframe,Sum,我是Python新手,目前面临一个无法解决的问题。我真的希望你能帮助我。英语不是我的母语,所以如果我不能正确地表达自己,我很抱歉 假设我有一个数据帧,如: import pandas as pd df = pd.DataFrame({'a': [1111,2222,3333,4444,5555,6666,7777,8888,9999], 'b':[0,0,1,0,1,0,0,0,1]}) 我需要对“a”中的数据求和,直到达到“b中有一个值”的条件。 这意味着对于给定的数据帧: At index

我是Python新手,目前面临一个无法解决的问题。我真的希望你能帮助我。英语不是我的母语,所以如果我不能正确地表达自己,我很抱歉

假设我有一个数据帧,如:

import pandas as pd
df = pd.DataFrame({'a': [1111,2222,3333,4444,5555,6666,7777,8888,9999], 'b':[0,0,1,0,1,0,0,0,1]})
我需要对“a”中的数据求和,直到达到“b中有一个值”的条件。 这意味着对于给定的数据帧:

At index=2 there is a 1 in b --> sum rows 0+1+2 = 6666
At index=4 there is a 1 in b --> sum rows 3+4 = 9999
At index=8 there is a 1 in b --> sum rows 5+6+7+8 = 33330
我尝试了if-else案例,但没有令人满意的结果

问候语

与“累计和”一起使用,然后使用“累计和”
sum

df = df.groupby(df.b.shift(fill_value=0).cumsum())['a'].sum().rename_axis(None).to_frame()
print (df)
       a
0   6666
1   9999
2  33330
对于新列,首先与
sum
一起使用,然后在
b
中设置
0
如果不匹配
1

运行:

请注意,分组是按b的相反顺序执行的,因此 在“向前”顺序的该列中,每个值1终止 当前组

“后处理”步骤包括:

  • 颠倒顺序(按索引)
  • 重置索引
  • 转换为数据帧(如果需要)

哦,太好了!谢谢你的快速回答!很好!我如何更改您的代码来创建一个新列,比如在1位于b中的位置用666699933330填充“cumsum”,并且原始数据帧看起来是一样的。好的,很抱歉,我对注释中的换行很愚蠢。。。希望这现在是可以理解的。如果
6666
9999
33330
位于第b列的同一行,则原始数据帧是否可以通过新列“cumsum”进行扩展
AB
01110
12220
23331
344440
455551
566660
677770
788880
899991
是的,看到并更改了它;)对于未来的观众:这两种解决方案都是有效的。还有一个命令来获取累计列的平均值吗?对于上述情况:
(1111+2222+3333)/3
(4444+5555)/2
?@Klamsi-通过
平均值
函数更改
总和
s = df.groupby(df.b.shift(fill_value=0).cumsum())['a'].transform('sum')
df['cumsum'] = np.where(df.b == 1, s, 0)

print (df)
      a  b  cumsum
0  1111  0       0
1  2222  0       0
2  3333  1    6666
3  4444  0       0
4  5555  1    9999
5  6666  0       0
6  7777  0       0
7  8888  0       0
8  9999  1   33330
df.a.groupby(df.b[::-1].cumsum()).sum()\
    .sort_index(ascending=False).reset_index(drop=True).to_frame()