假设我有一个如下所示的Pandas数据框:
A B
0 67 1
1 78 1
2 53 1
3 44 1
4 84 1
5 2 2
6 63 2
7 13 2
8 56 2
9 24 2
我的目标是:
1)根据B列对A列进行分组
2)作为groupby()的结果,使每个形成的组的第一行成为该组所有其他行的总和。在这种情况下,第一行中的值将被总和覆盖。
我想要的输出是:
A B
0 259 1
1 78 1
2 53 1
3 44 1
4 84 1
5 156 2
6 63 2
7 13 2
8 56 2
9 24 2
因此,第1组的第一行(基于B列分组)在A列中有259,因为第1组的除第一行以外的值是78 + 53 + 44 + 84 = 259 >
对于第2组,第2组的第一行为156,因为63 + 13 + 56 + 24 = 156
我花了几天时间试图弄清楚该怎么做,最后我投降了,希望这个伟大社区中的某个人能有所帮助。
答案 0 :(得分:4)
这是一种方法:
grp = df.groupby('B')
方法1(类似于@Kent删除的答案):
s=grp['A'].transform('sum').sub(df['A'])
idx=grp.head(1).index
df.loc[idx,'A']=s
方法2:
v= [g.iloc[1:].groupby('B')['A'].sum().iat[0] for _,g in grp]
idx = grp.head(1).index
df.loc[idx,'A'] = v
print(df)
A B
0 259 1
1 78 1
2 53 1
3 44 1
4 84 1
5 156 2
6 63 2
7 13 2
8 56 2
9 24 2