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

使用groupby筛选多组数据时KeyError问题排查

按年份、品牌、月份汇总销量时KeyError问题排查

问题场景

我尝试使用.groupby按指定年份、品牌、月份汇总销量数据,但持续报错:KeyError: ('Acura', '1', '2020')。但对应数据在导入的文件中确实存在,数据样例如下:

ANIO    ID_MES  MARCA   MODELO  UNI_VEH
2020    1       Acura   ILX     6
2020    1       Acura   Mdx     19
2020    1       Acura   Rdx     78
2020    1       Acura   TLX     7
2020    1       Honda   Accord- 195
2020    1       Honda   BR-V    557
2020    1       Honda   Civic   693
2020    1       Honda   CR-V    2095

我的代码如下:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel("HondaAcuraSales.xlsx")


def sumMonthValues (year, brand):
    count = 1
    sMonthSum = []
    if anio == 2022:
        months = 10
    else:
        months = 12
    while count <= months:
        month = 1
        monthS = str(mes)
        BmY = df.groupby(["BRAND","ID_MONTH","YEAR"])
        honda = BmY.get_group((brand, monthS, year))
        sales = honda["UNI_SOL"].sum()
        sMonthSum += [sales]
        month = month + 1
    return sumasMes


year = 2020
brand = ('Acura')

chuck = sumMonthValues (year, brand)

print (chuck)

请问我的数据分组方式是否存在问题?


问题分析与修正

你的代码存在多个关键错误,不止分组方式的问题:

1. 列名完全不匹配(核心原因)

数据中的列名是ANIO(年份)、ID_MES(月份)、MARCA(品牌)、UNI_VEH(销量),但代码里分组用的是"BRAND"、"ID_MONTH"、"YEAR",求和用的是"UNI_SOL"——这些列名在你的数据里根本不存在,这直接导致.groupby无法找到对应分组键,进而get_group抛出KeyError。

2. 变量名错误

  • 函数里用了anio、mes,但你定义的参数是year、循环变量应该是month,比如if anio == 2022:应该改为if year == 2022:,monthS = str(mes)改为monthS = str(month)。
  • 函数最后返回的sumasMes未定义,实际你创建的列表是sMonthSum。

3. 循环逻辑错误

while循环中count变量从未递增,且每次循环都将month重置为1,会导致死循环;同时没必要在循环内重复执行.groupby,应该提前分组一次即可。

修正后的代码

import pandas as pd

df = pd.read_excel("HondaAcuraSales.xlsx")

def sum_month_values(year, brand):
    # 先按品牌、月份、年份分组,提前计算好每个组的销量总和
    grouped = df.groupby(["MARCA", "ID_MES", "ANIO"])["UNI_VEH"].sum().reset_index()
    # 确定要遍历的月份数
    months = 10 if year == 2022 else 12
    s_month_sum = []
    
    for month in range(1, months + 1):
        # 筛选对应品牌、月份、年份的记录
        filtered = grouped[(grouped["MARCA"] == brand) & 
                          (grouped["ID_MES"] == month) & 
                          (grouped["ANIO"] == year)]
        # 如果有数据则取总和,否则加0
        sales = filtered["UNI_VEH"].iloc[0] if not filtered.empty else 0
        s_month_sum.append(sales)
    
    return s_month_sum

year = 2020
brand = "Acura"

chuck = sum_month_values(year, brand)
print(chuck)

或者更简洁的方式,利用分组后的索引直接查询:

import pandas as pd

df = pd.read_excel("HondaAcuraSales.xlsx")

def sum_month_values(year, brand):
    # 按品牌、月份、年份分组,设置为多层索引,方便查询
    grouped = df.groupby(["MARCA", "ID_MES", "ANIO"])["UNI_VEH"].sum()
    months = 10 if year == 2022 else 12
    s_month_sum = []
    
    for month in range(1, months + 1):
        try:
            sales = grouped.loc[(brand, month, year)]
        except KeyError:
            sales = 0
        s_month_sum.append(sales)
    
    return s_month_sum

year = 2020
brand = "Acura"

chuck = sum_month_values(year, brand)
print(chuck)

内容的提问来源于stack exchange,提问作者Adrián Desentis Flores

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:40:49