我有一个看起来像这样的数据框:
Id Country amount
1 AT 10
2 BE 20
3 DE 30
1 AT 10
1 BE 20
3 DK 30
我想要做的是按ID,国家/地区,
所以我的df应该看起来像:
Id Country amount AT_amount BE_amount DE_amount DK_amount
1 AT 10 20 20 0 0
2 BE 20 0 20 0 0
3 DE 30 0 0 30 30
1 AT 10 20 20 0 0
1 BE 20 20 20 0 0
3 DK 30 0 0 30 30
我尝试使用groupby,但是使用:
df['AT_amount'] = df.groupby(['Id', 'Country').sum(amount)
将无法使用,因为从那时起,我将无法获得所有Id == 1的值,而只能获得ID == 1的值,并且无论我身在何国都可以给我一个值。
我可以先执行此操作,如果country!= AT,则将值设置为0,然后将groupby设置为最大值,但这似乎还有很长的路要走。
要获得所有国家/地区的这些值,似乎我必须编写一个循环,或者是否有快速方法为所有子组国家/地区创建新变量?
最佳答案
我认为您可以使用pivot_table
,add_suffix
和最后一个merge
:
df1 = df.pivot_table(index='Id',
columns='Country',
values='amount',
fill_value='0',
aggfunc=sum).add_suffix('_amount').reset_index()
print df1
Country Id AT_amount BE_amount DE_amount DK_amount
0 1 20 20 0 0
1 2 0 20 0 0
2 3 0 0 30 30
print pd.merge(df,df1, on='Id', how='left')
Id Country amount AT_amount BE_amount DE_amount DK_amount
0 1 AT 10 20 20 0 0
1 2 BE 20 0 20 0 0
2 3 DE 30 0 0 30 30
3 1 AT 10 20 20 0 0
4 1 BE 20 20 20 0 0
5 3 DK 30 0 0 30 30
关于python - 按组和子组汇总,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36910353/