如何使用Pandas创建列多级索引层级不同的DataFrame并解决新增列报错
错误原因
你的DataFrame列索引为固定3级的MultiIndex结构,所有列必须对应长度为3的元组(level_1, level_2, level_3),层级长度不匹配就会触发索引异常:
df.loc[index, 'route'] = something能执行成功是Pandas的兼容逻辑:会自动将单级的route补全为('route', NaN, NaN)的三级列索引,本质上新增的仍然是符合3级结构的列,不是真的1级列。('route', 'best')是长度为2的元组,和3级索引的要求长度不匹配,Pandas无法自动补全匹配,也找不到对应存在的列,就会抛出KeyError。
解决方案
逐行赋值写法
直接传入完整的3级列索引元组即可,第三级可以根据你的需求设置为空字符串或者自定义命名:
for index, row in df.iterrows(): # 第三级设为空 df.loc[index, ('route', 'best', '')] = something # 或者第三级设为自定义命名,比如'val' # df.loc[index, ('route', 'best', 'val')] = something
更高效的整列赋值写法
逐行iterrows遍历的效率很低,数据量超过千行时建议直接用向量化的整列赋值,不需要循环:
# something可以是固定值,也可以是和df行数相同的序列/列表 df[('route', 'best', 'val')] = something
批量新增多列写法
如果需要提前批量新增多个多级列,可以用reindex一次性更新列索引:
# 定义要新增的所有三级列 new_columns = [ ('route', 'best', 'val'), ('route', 'worst', 'val'), ('route', 'avg', 'val') ] # 合并原有列和新增列,重建列索引 all_columns = list(df.columns) + new_columns df = df.reindex(columns=pd.MultiIndex.from_tuples(all_columns, names=df.columns.names))
内容的提问来源于stack exchange,提问作者Florent
相关产品推荐
相关产品推荐

