Python,pandas,匹配组新列中的累加总和

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

如何创建列c,其中使用列a(字符串)的分组对列b求和,同时保留现有数据帧。有些行可以属于多个组。

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

有一个简单而有效的解决方案,因为我拥有的数据帧非常大。


您首先需要将拆分列ajoin拆分为原始的DataFrame

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

然后将transform用于sum,而不会发生结块。

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

最后一个groupby按索引,汇总列按agg

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