首页 > 解决方案 > 合并 df 与自身分组

问题描述

我有一个df

id         qty      location
1          1        Paris
1          10       Rome
1          50       London
2          100      Paris
2          40       Oslo
3          2        Paris
3          9        Washington
3          10       London

我正在尝试获取qty巴黎、罗马和其他地区的总和,location以便df看起来像这样:

id      qty_total       qty_Paris       qty_Rome        qty_other
1       61              1               10              50
2       140             100             0               40
3       21              2               0               19

我尝试了什么:

df_temp = df.groupby('id')['qty'].sum()
df_temp['qty_Paris'] = df[df.groupby(['id', 'location'])[['qty']]
                       .sum().reset_index()['location']=='Paris']

但我收到一个错误:

作为索引器提供的不可对齐的布尔系列(布尔系列的索引和索引对象的索引不匹配)。

我应该如何解决这个问题才能得到df我想要的?

标签: pythonpandas

解决方案


单程:

df.loc[~df.location.isin(['Paris', 'Rome']), 'location'] = 'Others'
df1 = df.pivot_table(index='id', columns='location', values='qty',
                     aggfunc=sum, fill_value=0,).add_prefix('qty_').rename_axis(columns=None)
df1['qty_total'] = df1.sum(1)
输出:
    qty_Others  qty_Paris  qty_Rome  qty_total
id                                            
1           50          1        10         61
2           40        100         0        140
3           19          2         0         21

完整示例:

df = pd.DataFrame({'id': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 3, 6: 3, 7: 3},
                   'qty': {0: 1, 1: 10, 2: 50, 3: 100, 4: 40, 5: 2, 6: 9, 7: 10},
                   'location': {0: 'Paris',
                                1: 'Rome',
                                2: 'London',
                                3: 'Paris',
                                4: 'Oslo',
                                5: 'Paris',
                                6: 'Washington',
                                7: 'London'}})
df.loc[~df.location.isin(['Paris', 'Rome']), 'location'] = 'Others'
df1 = df.pivot_table(index='id', columns='location', values='qty',
                     aggfunc=sum, fill_value=0,).add_prefix('qty_').rename_axis(columns=None)
df1['qty_total'] = df1.sum(1)

推荐阅读