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

Python:基于pandas DataFrame行更新嵌套字典默认值及解决引用问题

问题原因

你初始化嵌套字典时,所有主key对应的value都指向了同一个字典对象kdf_key_dic,字典属于Python可变对象,多个引用指向同一个可变对象时,修改任意引用都会同步修改所有引用指向的内容。因此你更新任意product对应的嵌套字典,所有product的嵌套字典都会同步更新,最终得到完全一致的结果。

解决方法

方案1:修复原有初始化逻辑

只需要调整初始化代码,给每个product生成独立的嵌套字典副本即可,后续更新逻辑保持不变:

# 提前获取所有唯一id
unique_ids = df['id'].unique().tolist()
# 每个主key对应独立的嵌套字典,不再复用同一个对象
product_key_dic = {
    product: {id_val: None for id_val in unique_ids} 
    for product in df['Product'].unique().tolist()
}

# 原有更新逻辑可正常运行
for index, row in df.iterrows():
    product_key_dic[row['Product']].update({row['id']:row['qtt']})

方案2:更高效的Pandas原生实现

无需手动遍历行,通过分组聚合直接生成目标字典,代码更简洁:

unique_ids = df['id'].unique()
# 生成默认值模板方法
get_default_dict = lambda: {id_val: None for id_val in unique_ids}

# 分组后合并默认值与实际取值
product_key_dic = df.groupby('Product')[['id', 'qtt']].apply(
    lambda group: {**get_default_dict(), **dict(zip(group['id'], group['qtt']))}
).to_dict()

两种方案运行后都可以得到你期望的输出:

{
 'computer': {1: 10, 2: 20, 4: 40, 3: None},
 'laptop': {1: 100, 2: None, 4: None, 3: 30},
 'printer': {1: None, 2: 200, 4: None, 3: None}
}

内容的提问来源于stack exchange,提问作者Alg_D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:30:04