如何将Pandas DataFrame转换为指定层级结构的嵌套字典
你原来的写法问题在于:每次直接对my_dict[row['Guest']]赋值会覆盖该客户的已有数据,所以同一个客户有多条记录时只会保留最后一条,需要逐层判断层级是否存在,不存在则初始化后再添加商品数据。
方案1:循环遍历实现(逻辑易懂,可灵活调整)
import pandas as pd # 按需处理GuestCode为NaN的情况,也可以自行修改默认值,或者提前过滤空值行 df['GuestCode'] = df['GuestCode'].fillna('未知编码') my_dict = {} for _, row in df.iterrows(): guest = row['Guest'] code = row['GuestCode'] invoice = row['Invoice No'] product = row['ProductName'] qty = row['Quantity'] # 逐层初始化字典层级,避免KeyError if guest not in my_dict: my_dict[guest] = {} if code not in my_dict[guest]: my_dict[guest][code] = {} if invoice not in my_dict[guest][code]: my_dict[guest][code][invoice] = {} # 仅写入当前商品的数量,不会覆盖同订单下的其他商品 my_dict[guest][code][invoice][product] = qty
方案2:Pandas分组聚合实现(代码更简洁)
通过多层分组逐层向上聚合为字典,不需要手写循环逻辑:
my_dict = (df.groupby(['Guest', 'GuestCode', 'Invoice No']) .apply(lambda x: dict(zip(x['ProductName'], x['Quantity']))) .groupby(level=[0,1]) .apply(lambda x: x.droplevel([0,1]).to_dict()) .groupby(level=0) .apply(lambda x: x.droplevel(0).to_dict()) .to_dict())
最终输出效果
{ "Maria": { "未知编码": { "OBFL22511": { "Pro Plus Cream": 2, "Soothe Stress Cream": 1 } } }, "Sanchez": { "OBFLG3108": { "OBFL22524": { "Pro Plus Cream": 1 } } }, "Karen": { "OBFLG1600": { "OBFL22525": { "Soothe Stress Cream": 1, "Pro Plus Cream": 1 } } } }
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

