首页 > 解决方案 > 将数据框聚合到嵌套字典(python)

问题描述

我想将此数据框转换为字典,

import pandas as pd
df = pd.DataFrame({'Date': {0: 44197,1: 44197,2: 44197,3: 44197,4: 44198,5: 44198,6: 44198,7: 44198,8: 44197,9: 44197,10: 44197,11: 44197,12: 44198,13: 44198,14: 44198,15: 44198},
 'Product': {0: 'B',1: 'A',2: 'C',3: 'D',4: 'B',5: 'A',6: 'C',7: 'D',8: 'B',9: 'A',10: 'C',11: 'D',12: 'B',13: 'A',14: 'C',15: 'D'},
 'Seller': {0: 'XXX',1: 'XXX',2: 'XXX',3: 'XXX',4: 'XXX',5: 'XXX',6: 'XXX',7: 'XXX',8: 'YYY',9: 'YYY',10: 'YYY',11: 'YYY',12: 'YYY',13: 'YYY',14: 'YYY',15: 'YYY'},
 'Price': {0: 10,1: 25,2: 36,3: 14,4: 60,5: 31,6: 2,7: 7,8: 5,9: 9,10: 10,11: 26,12: 36,13: 78,14: 95,15: 100}})

这是数据框的样子,

在此处输入图像描述

我想根据卖方创建字典键,然后将每个日期分组产品作为键,所以 A 是键,价格是项目

订单是卖方 => 日期(因为将是 1000 个日期)=> 对于每个日期,您将有 4 种产品及其相应的价格。

有谁知道如何做到这一点 ?我的真实表是非常大的 100K 行,我的目标也是尽可能快地做到这一点。

我想要的结果如下所示:

{XXX:{"01/01/2021":{ A : Value1 , B : Value2 , C : Value3 , D : Value4 },"02/01/2021":{ .......}}, "YYY" : ....... }

标签: pythonpandasdataframedictionary

解决方案


groupped_df = df.groupby(['Seller', 'Date']).apply(lambda x: x.set_index('Product').to_dict()).apply(lambda x: x['Price'])
desired_dict = {level: groupped_df.xs(level).to_dict() for level in groupped_df.index.levels[0]}

输出:

Out[100]: 
{'XXX': {44197: {'B': 10, 'A': 25, 'C': 36, 'D': 14},
  44198: {'B': 60, 'A': 31, 'C': 2, 'D': 7}},
 'YYY': {44197: {'B': 5, 'A': 9, 'C': 10, 'D': 26},
  44198: {'B': 36, 'A': 78, 'C': 95, 'D': 100}}}

在第一行,我们将分组并创建一个系列,其中卖家和日期是索引,值是所需的字典(最嵌套的字典)。这就是在 上发生的情况groupped_df = df.groupby(['Seller', 'Date']).apply(lambda x: x.set_index('Product').to_dict()),但是由于它在字典中创建了一些额外的“数据”,所以我还添加.apply(lambda x: x['Price'])了仅选择价格。

在第一行之后,groupped_df看起来像这样:

Out[101]: 
Seller  Date 
XXX     44197     {'B': 10, 'A': 25, 'C': 36, 'D': 14}
        44198       {'B': 60, 'A': 31, 'C': 2, 'D': 7}
YYY     44197       {'B': 5, 'A': 9, 'C': 10, 'D': 26}
        44198    {'B': 36, 'A': 78, 'C': 95, 'D': 100}

第二行将多索引转换为嵌套字典,就像在这个答案中一样(注意不需要 'index' arg in to_dict


推荐阅读