Python groupby sum映射到另一个datafram

2024-09-28 03:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据帧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()

通过运行这个groupby,我得到:

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
  ...

Tags: 数据nameidvaluecountsumgroupbydtype
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)

你也可以这样使用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

用一条带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

相关问题 更多 >

    热门问题