我的数据框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
...
答案 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