【问题标题】:Pandas pivot table with column as dictionary以列为字典的 Pandas 数据透视表
【发布时间】:2020-06-13 07:44:25
【问题描述】:

我有一个看起来像这样的数据框。只有order 是唯一的。

vendor  order order_class    time
33       33     42        22/12/2018
33       39     189       25/12/2018
35       197    91        19/01/2019
35       22     189       18/12/2018
35       11     189       30/11/2018

如何将我的数据框旋转为如下所示,其中键为 order_class,值为 [(order1, time1), (order2, time2)]

vendor   dict
33       {42 : [(33, 25/12/2018)], 189 : [(39, 25/12/2018)]}
35       {91 : [(197, 19/01/2019)], 189: [(22, 18/12/2018), (11, 30/11/2018)]}

*已编辑

一个订单类可以有多个(订单、时间)值,这些值需要存储在一个列表中。

【问题讨论】:

    标签: pandas dataframe dictionary pivot


    【解决方案1】:

    使用groupbyaggzip 的替代方法:

    d1 = df.groupby(['vendor', 'order_class']).agg(list).reset_index(level=1)
    d2 = d1.apply(lambda s: {s['order_class']: list(zip(s['order'], s['time']))}, axis=1)
    d2 = d2.groupby(level=0).agg(lambda s: {k:v for d in s for k, v in d.items()}).rename('_dict').reset_index()
    

     #print(d2)
    vendor   dict
    33       {42 : [(33, 22/12/2018)], 189 : [(39, 25/12/2018)]}
    35       {91 : [(197, 19/01/2019)], 189: [(22, 18/12/2018), (11, 30/11/2018)]}
    

    【讨论】:

    • @MrSoLoDoLo 编辑了代码以反映您的要求。
    【解决方案2】:
       #Create tuple of order and time
    
    df['dict']=[[x] for x in tuple(zip(df['order'], df['time']))]
    
    
    #Use groupby, apply .agg(dict) and drop unrequired columns
    
    df.set_index('order_class').groupby('vendor').agg(dict).drop(columns=['time','order']).reset_index()
    
    
    
        vendor     dict
    0   33         {42: [(33, '22/12/2018')], 189: [(39, '25/12/2...
    1   35         {91: [(197, '19/01/2019')], 189: [[(22, '18/12...
    

    【讨论】:

    • 我意识到一个订单类可以有多个订单,因此字典的值必须存储在包含元组对的列表中。我如何反映这种变化?
    【解决方案3】:

    这是一种可能的方法,通过压缩 3 列并创建一个 dict,然后使用 chain 我们可以将它们聚合在一起,在 vendor 列上分组:

    from itertools import chain
    f = lambda x: dict(chain(*map( dict.items, x)))
    
    l = [{a:(b,c)} for a,b,c in zip(df['order_class'],df['order'],df['time'])]
    pd.Series(l,name='dict_').groupby(df['vendor']).agg(f).reset_index()
    

       vendor                                              dict_
    0      33  {42: (33, '22/12/2018'), 189: (39, '25/12/2018')}
    1      35  {91: (197, '19/01/2019'), 189: (22, '18/12/201...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 2021-01-17
      • 1970-01-01
      • 2023-03-23
      • 2022-07-26
      • 2019-08-15
      • 2022-11-23
      相关资源
      最近更新 更多