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

