【问题标题】:Merge df with itself grouped合并 df 与自身分组
【发布时间】:2021-06-23 08:24:50
【问题描述】:

我有一个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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    一种方式:

    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)
    

    【讨论】:

    • @jonas 你确定你使用的是第一行代码 sn-p 吗?这就是让所有其他地点都成为其他地点的原因。
    • 出于某种原因,我只将qty_Othersqty_total 作为单独的列,但没有将ParisRome 作为单独的列。我使用了错误的列,但这次我使用的是完整的 sn-p。
    • @JonasPalačionis 添加了一个完整的工作示例。
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2020-05-04
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多