基于pandas与字典键实现DataFrame区域聚类时的KeyError: True报错问题
报错根因
KeyError: True 由两个问题共同导致:
- 筛选条件写法完全错误:你写的
DF["subdivision_name"].any() in reference_dict[area]里,Series.any()只会返回单个全局布尔值——只要列里存在任意一个真值就返回True,根本不是逐行判断的筛选掩码。当你把这个单个布尔值传给DF[]切片时,pandas会把传入值当成列名查找,自然找不到叫True的列,直接触发KeyError。 - 变量名拼写不一致:你函数里校验区域合法性时写的
if area in subdivision_dict,和全局定义的参考字典reference_dict名称不匹配,后续还会触发未定义变量的报错。
修复方案
逐行匹配subdivision必须用pandas自带的Series.isin()生成布尔掩码,再结合分组逻辑输出你要的带区域名、日期、汇总值的结果表。
完整可运行的代码实现
import pandas as pd # 基础测试数据 DF_draft = pd.DataFrame(data={"subdivision_name" : ["01","02","03","04","05"], "day": ["2020-03-18","2020-03-18","2020-03-18","2020-03-18","2020-03-18"], "data":[0,11,12,13,2]}) # 参考区域映射字典 reference_dict = {"Area Alpha": ["01","03","04","15","26","38","42","43","63","69","73","74"], "Area Beta" : ["21","25","39","58","70","71","89","90"], "Area Gaga" : ["02","01","07","57","88","67","68","54"]} def area_cluster(DF, area_name_list): # 校验传入的区域名是否合法 invalid_areas = [area for area in area_name_list if area not in reference_dict] if invalid_areas: print(f"拼写错误,不存在的区域:{', '.join(invalid_areas)}") return None # 构造subdivision到所属区域的映射关系 sub_to_area = {} for area in area_name_list: for sub_id in reference_dict[area]: sub_to_area[sub_id] = area # 筛选出属于目标区域的明细行 matched_rows = DF[DF["subdivision_name"].isin(sub_to_area.keys())].copy() # 给明细行打上所属区域标签 matched_rows["area_name"] = matched_rows["subdivision_name"].map(sub_to_area) # 按区域+日期分组,对data值求和,生成最终汇总表 result_table = matched_rows.groupby(["area_name", "day"], as_index=False)["data"].sum() # 调整输出结构,和你给的示例格式对齐 result_table = result_table.set_index("area_name").rename(columns={"data": area_name_list[0]}) return result_table
调用测试
执行area_cluster(DF_draft, ["Area Alpha"]),输出结果完全匹配预期:
day Area Alpha area_name Area Alpha 2020-03-18 25
计算逻辑验证:Area Alpha 匹配的subdivision为01(data=0)、03(data=12)、04(data=13),总和25,和示例结果完全一致。支持同时传入多个区域名,会自动逐行汇总每个区域的数值。
内容的提问来源于stack exchange,提问作者Raphadasilva
相关产品推荐
相关产品推荐

