将pandas DF转换为特殊字典?

时间:2018-03-10 16:37:20

标签: python-3.x pandas

我有一个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', .....}

2 个答案:

答案 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)]}