Pandas groupby by multiple columns,sum和append answer as new column to original dataframe

时间:2018-06-14 09:53:26

标签: python pandas dataframe

我有以下数据框:

In [1]:
import pandas as pd

pd.DataFrame({"AAA":["x1","x1","x1","x1"],
              "BBB":["y1","y1","y1","y2"],
              "CCC":["t1","t2","t3","t1"],
              "DDD":[10,11,18,17]})

Out[1]:
  AAA BBB CCC  DDD
0  x1  y1  t1   10
1  x1  y1  t2   11
2  x1  y1  t3   18
3  x1  y2  t1   17

我想对"DDD"定义的组的groupby(["AAA","BBB"])列中的值求和。

所以:

  1. 第0行(x1, y1, t1, 10),第1行(x1, y1, t2, 11),第2行(x1, y1, t3, 18)是一个组。
  2. 我想在数据框中添加一个新列,总结" DDD"柱
  3. 所以我的行向量将变为:
  4. 第0行(x1, y1, t1, 10, 39),第1行(x1, y1, t2, 11, 39),第2行(x1, y1, t3, 18, 39)
  5. 我希望有一个新列,其中包含按操作分组的值。我想要以下数据框:

    In [2]:
    pd.DataFrame({"AAA":["x1","x1","x1","x1"],
                  "BBB":["y1","y1","y1","y2"],
                  "CCC":["t1","t2","t3","t1"],
                  "DDD":[10,11,18,17],
                  "AAA_BBB_sum":[39,39,39,17]})
    Out[2]:
      AAA  AAA_BBB_sum BBB CCC  DDD
    0  x1           39  y1  t1   10
    1  x1           39  y1  t2   11
    2  x1           39  y1  t3   18
    3  x1           17  y2  t1   17
    

    最好怎么做?

    我想到的一种方式(但我正在努力实施)是:

    1. 创建一个新列,它是AAABBB的串联,以便 他们是独一无二的
    2. AAADDD分组,所以我仍然可以选择
      AAABBB
    3. 为每个小组创建DDD的总和
    4. 将此作为查找'表格,用于根据匹配的AAABBB
    5. 将值插入新列

      我确定必须有更好的方法。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

一种方法是使用:

df['AAA_BBB sum'] = df.groupby(['AAA', 'BBB'])['DDD'].transform(lambda x: x.sum())

这给出了:

    AAA  BBB  CCC  DDD  AAA_BBB sum
0    x1   y1   t1   10           39
1    x1   y1   t2   11           39
2    x1   y1   t3   18           39
3    x1   y2   t1   17           17