Python-groupby sum映射到另一个数据框

时间:2019-01-06 18:52:44

标签: python pandas group-by pandas-groupby series

我的数据框A:

id   groupA    groupB    groupC    groupD   groupE    ...
001    0         0         0         0        0
002    0         0         0         0        0
003    0         0         0         0        0
  ...

数据框B:

id     value     count
001    groupA      2
002    groupB      1
001    groupB      3
001    groupC      1
003    groupC      2
002    groupA      1


dfB.groupby(['id', 'value'])['count'].sum()

通过运行此组,我得到:

id  value 
1   groupA    2
    groupB    3
    groupC    1
2   groupA    1
    groupB    1
3   groupC    2
Name: count, dtype: int64

我试图将结果转换为数据框,然后将其映射回数据框A,但没有成功。

我理想的数据帧输出是:

id   groupA    groupB    groupC    groupD   groupE    ...
001    2         3         1         0        0
002    1         1         0         0        0
003    0         0         2         0        0
  ...

3 个答案:

答案 0 :(得分:3)

您可以旋转df2并合并两个数据框,

df2.pivot_table(index = 'id', columns = 'value', values = 'count', aggfunc='sum').reset_index()\
.merge(df1, how = 'left').fillna(0).astype(int)


    id  groupA  groupB  groupC  groupD  groupE
0   1   2       3       1       0       0
1   2   1       1       0       0       0
2   3   0       0       2       0       0

您也可以对groupby进行同样的操作,

df2.groupby(['id', 'value'])['count'].sum().unstack().reset_index()\
.merge(df1, how = 'left').fillna(0).astype(int)

答案 1 :(得分:3)

使用reindex

处理单线链
dfb.groupby(['id', 'value'])['count'].sum().\
     unstack(fill_value=0).\
       reindex(columns=dfa.columns,index=dfa.id,fill_value=0).\
        drop('id',1)
    groupA  groupB  groupC  groupD  groupE
id                                        
1        2       3       1       0       0
2        1       1       0       0       0
3        0       0       2       0       0

答案 2 :(得分:2)

您也可以像这样使用pivot。看起来更干净

df

   id    value  count
0   1   groupA  2
1   2   groupB  1
2   1   groupB  3
3   1   groupC  1
4   3   groupC  2
5   2   groupA  1
6   3   groupA  5

aa = pd.DataFrame(df.groupby(by=["id", "value"]).sum()).reset_index().pivot(index="id", columns="value", values="count").fillna(0)
aa.columns.name = aa.index.name
aa.index.name = ""
aa

id  groupA  groupB  groupC
1   5.0 3.0 1.0
2   1.0 1.0 0.0
3   5.0 0.0 2.0