You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:15:04