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

使用Pandas DataFrame更新嵌套字典值时的批量更新异常问题

问题:Pandas更新嵌套字典时意外修改所有子字典

你遇到的是Python中可变对象引用的经典坑——你的代码里所有父键对应的子字典其实是同一个对象,所以修改任意一个子字典,其他所有子字典都会跟着变。

问题根源

你最初创建子字典的代码是:

sub_dictionary = dict.fromkeys(list_two, 0)
for item in list_one:
    dictionary[item] = sub_dictionary

这里sub_dictionary是一个字典对象,每次循环只是把这个对象的引用赋值给dictionary[item]。也就是说,dictionary[1]、dictionary[2]……指向的都是内存中的同一个字典,修改其中任何一个,其他的都会同步变化。

解决方案:每次循环创建新的子字典

只需要修改生成子字典的逻辑,让每个父键都对应一个全新的字典对象,而不是复用同一个引用。有两种常见方式:

方式1:在循环内调用dict.fromkeys生成新字典

import pprint
import pandas as pd

update_dict = [
 [1, 10],
 [1, 30],
 [2, 20],
 [2, 40],
]
update_df = pd.DataFrame(update_dict, columns=['list_one', 'list_two'])
list_one = [1, 2, 3, 4, 5]
list_two = [10, 20, 30, 40]

dictionary = {}
# 关键修改:每次循环生成新的子字典
for item in list_one:
    dictionary[item] = dict.fromkeys(list_two, 0)

for item in list_one:
    sub_df = update_df[update_df['list_one'] == item]
    sub_list = sorted(list(set(sub_df['list_two'].to_list())))
    for sub_item in sub_list:
        dictionary[item][sub_item] = 1

pprint.pprint(dictionary)

方式2:用字典推导式生成新字典(可读性更强)

把生成子字典的代码改成字典推导式,效果完全一样:

for item in list_one:
    dictionary[item] = {k: 0 for k in list_two}

运行结果

执行修正后的代码,就能得到你期望的输出:

{1: {10: 1, 20: 0, 30: 1, 40: 0},
 2: {10: 0, 20: 1, 30: 0, 40: 1},
 3: {10: 0, 20: 0, 30: 0, 40: 0},
 4: {10: 0, 20: 0, 30: 0, 40: 0},
 5: {10: 0, 20: 0, 30: 0, 40: 0}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:26:13