Pandas 列作为字典的数据透视表

Pandas 列作为字典的数据透视表,pandas,dataframe,dictionary,pivot,Pandas,Dataframe,Dictionary,Pivot,我有一个数据框,看起来像这样。只有订单是唯一的 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 我如何使数据

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

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\u class
,值是
[(order1,time1),(order2,time2)]

*编辑


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

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

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()


另一种方法是使用
groupby
agg
zip

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()


我意识到order类可以有多个订单,因此字典的值必须存储在包含元组对的列表中。如何反映此更改?@MrSoLoDoLo编辑代码以反映您的要求。
   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...
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)]}
   #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...