使用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
相关产品推荐
相关产品推荐

