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

Python构建年份-月份嵌套字典时数据被覆盖的问题求助

问题分析与解决方案

核心错误原因

  1. 字典引用复用:你创建的months字典是同一个对象,所有年份的字典值都指向它,导致修改任意年份的月份数据都会同步到所有年份。
  2. 列表未重置:mesecategorielabel、meseValue、insieme这些列表在循环中没有重新初始化,数据会持续累加,最终所有月份都使用最后一次循环的结果。
  3. 赋值逻辑错误:内层循环中仅在最后一个月份时才赋值,且没有正确对应每个月份的计算结果。

修复后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:30:41