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

