Python DataFrame:在达到条件之前的列的累积和,并在新列中返回和
我是Python新手,目前面临一个无法解决的问题。我真的希望你能帮助我。英语不是我的母语,所以如果我不能正确地表达自己,我很抱歉 假设我有一个数据帧,如: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
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终止
当前组
“后处理”步骤包括:
- 颠倒顺序(按索引)
- 重置索引
- 转换为数据帧(如果需要)
6666
9999
和33330
位于第b列的同一行,则原始数据帧是否可以通过新列“cumsum”进行扩展AB
01110
12220
23331
344440
455551
566660
677770
788880899991
是的,看到并更改了它;)对于未来的观众:这两种解决方案都是有效的。还有一个命令来获取累计列的平均值吗?对于上述情况:(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()