Python, pandas, cumulative sum in new column on matching groups
如果我在数据框中有这些列:
1 2 3 4 5 6 | a b 1 5 1 7 2 3 1,2 3 2 5 |
如何创建列
1 2 3 4 5 6 | a b c 1 5 15 1 7 15 2 3 11 1,2 3 26 2 5 11 |
有一个简单而有效的解决方案,因为我拥有的数据帧非常大。
您首先需要将拆分列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | print (df.a.str.split(',', expand=True) .stack() .reset_index(level=1, drop=True) .rename('a')) 0 1 1 1 2 2 3 1 3 2 4 2 Name: a, dtype: object df1 = df.drop('a', axis=1) .join(df.a.str.split(',', expand=True) .stack() .reset_index(level=1, drop=True) .rename('a')) print (df1) b a 0 5 1 1 7 1 2 3 2 3 3 1 3 3 2 4 5 2 |
然后将
1 2 3 4 5 6 7 8 9 10 11 | df1['c'] = df1.groupby(['a'])['b'].transform(sum) #cast for aggreagation join working with strings df1['a'] = df1.a.astype(str) print (df1) b a c 0 5 1 15 1 7 1 15 2 3 2 11 3 3 1 15 3 3 2 11 4 5 2 11 |
最后一个
1 2 3 4 5 6 7 8 9 10 | print (df1.groupby(level=0) .agg({'a':','.join,'b':'first' ,'c':sum}) [['a','b','c']] ) a b c 0 1 5 15 1 1 7 15 2 2 3 11 3 1,2 3 26 4 2 5 11 |