如何向Pandas pivot_table传递列表中的多索引参数以避免KeyError
错误原因
- 第一种写法中
r'"3","4"'是单个完整字符串,pandas会尝试寻找列名完全等于'3','4'的字段,不存在就抛出KeyError。 - 第二种将第三个元素改为
["3","4"]后仍然报错,是因为循环里你给i额外套了一层[],当i本身是列表时,实际传入index参数的值为[["3","4"]],相当于把整个列表当成了单个列名,自然匹配不到。
解决方案
方案1(更规范,推荐)
统一将rows里的所有元素都存为「列名列表」格式,单个列名也包裹成单元素列表,循环时直接传入即可:
import pandas as pd import numpy as np # 统一所有index参数为列表格式 rows = [ ["1"], ["2"], ["3", "4"] ] for idx_cols in rows: table = pd.pivot_table( df.fillna(0), index=idx_cols, # 直接传列名列表,无需额外套[] values=["X", "Y"], aggfunc=[np.sum], fill_value=0, margins=True, # 注意这里应该传布尔值True,不是字符串"True" margins_name="Tot." ) # 后续处理table的逻辑
方案2(适配原有字符串格式输入)
如果你无法修改rows的原始输入格式,仍然是字符串形式的r'"3","4"',可以在循环内先做字符串拆分处理:
rows = ["1", "2", r'"3","4"'] for i in rows: # 拆分字符串、清理引号,生成列名列表 idx_cols = [col.strip('"\'') for col in i.split(',')] table = pd.pivot_table( df.fillna(0), index=idx_cols, values=["X", "Y"], aggfunc=[np.sum], fill_value=0, margins=True, margins_name="Tot." )
内容的提问来源于stack exchange,提问作者Eugenio
相关产品推荐
相关产品推荐

