Python构建年份-月份嵌套字典时数据被覆盖的问题求助
问题分析与解决方案
核心错误原因
- 字典引用复用:你创建的
months字典是同一个对象,所有年份的字典值都指向它,导致修改任意年份的月份数据都会同步到所有年份。 - 列表未重置:
mesecategorielabel、meseValue、insieme这些列表在循环中没有重新初始化,数据会持续累加,最终所有月份都使用最后一次循环的结果。 - 赋值逻辑错误:内层循环中仅在最后一个月份时才赋值,且没有正确对应每个月份的计算结果。
修复后的代码
import pandas as pd # 假设你的DataFrame已经定义,lista_cat_pulita是分类列表 years = ['2001.0', '2002.0', '2003.0'] dyears = {} # 为每个年份创建独立的月份字典,避免引用复用 for year in years: dyears[year] = {m: None for m in range(1, 13)} for anno in years: # 转换年份为对应类型(和DataFrame中的anno列类型一致) a = float(anno) if anno.endswith('.0') else int(anno) for mese in range(1, 13): m = mese # 每次循环都初始化新的列表,避免数据累加 mesecategorielabel = [] meseValue = [] for argomento in lista_cat_pulita: # 计算对应分类的总和 total = df.loc[(df["tipo"] == "Expense") & (df["mese"] == m) & (df["anno"] == a) & (df["categoria"] == argomento), "somma"].sum() mesecategorielabel.append(argomento) meseValue.append(total) # 组装当前月份的标签和值列表 insieme = [mesecategorielabel, meseValue] # 直接赋值给对应年份的对应月份,无需额外循环查找 dyears[anno][mese] = insieme print(dyears)
关键修复点说明
- 独立创建月份字典:通过
{m: None for m in range(1, 13)}为每个年份生成全新的月份字典,彻底解决引用复用问题。 - 循环内初始化列表:在每个月份的循环里重新创建
mesecategorielabel、meseValue,确保每个月份的数据都是独立的。 - 简化赋值逻辑:直接通过
dyears[anno][mese] = insieme赋值,避免多余的循环查找,减少出错概率。 - 类型匹配:将字符串类型的年份转换为和DataFrame中
anno列一致的数值类型(float或int),保证筛选条件正确匹配。
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

