我有一个看起来像这样的数据框:

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_tableadd_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/

10-10 07:56