我有一个DataFrame,其中包含他们购买的customer_id,date,product_id。我想将此DataFrame转换为2字典
customer_id date product_id
1 10/3/2017 1234
2 11/3/2017 4321
1 10/3/2017 7384
2 10/3/2017 1234
我希望输出如下:
{'10/3/2017': {1 : 1234, 1: 7384, 2: 1234}, '11/3/2017': {2 : 4321}}
我尝试使用
df.set_index(['date','customer_number']).T.to_dict('record')
但它不会给我2个词典。
{('10/3/2017', 1): 1234', .....}
答案 0 :(得分:2)
第一行和第三行中每个组有重复的问题,因此返回1: 7384
。解决方案使用groupby
和lambda函数将每个组转换为dict
,然后to_dict
转换为最终Series
:
d = df.groupby('date').apply(lambda x: dict(zip(x['customer_id'], x['product_id']))).to_dict()
print (d)
{'10/3/2017': {1: 7384, 2: 1234}, '11/3/2017': {2: 4321}}
编辑:
s = df.groupby(['date','customer_id'])['product_id'].apply(list)
d = {k: v[k].to_dict() for k, v in s.groupby(level=0)}
print (d)
{'10/3/2017': {1: [1234, 7384], 2: [1234]}, '11/3/2017': {2: [4321]}}
如果不需要一个项目列表:
s = (df.groupby(['date','customer_id'])['product_id']
.apply(lambda x: list(x) if len(x) > 1 else x.iat[0]))
d = {k: v[k].to_dict() for k, v in s.groupby(level=0)}
print (d)
{'10/3/2017': {1: [1234, 7384], 2: 1234}, '11/3/2017': {2: 4321}}
答案 1 :(得分:1)
添加jezrael的解决方案,您可以在apply函数中使用 list 而不是 dict 来获取所需的输出。这样就可以删除重复项,因为我们通过使用dict来删除。
d = df.groupby('date').apply(lambda x: list((zip(x['customer_id'], x['product_id'])))).to_dict()
输出结果为:
{'10/3/2017': [(1, 1234), (1, 7384), (2, 1234)], '11/3/2017': [(2, 4321)]}