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...