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

Pandas填充0/1关联矩阵触发KeyError: 'ZH'如何解决

问题说明

需要构建0/1值归属矩阵df2:

  • 行对应瑞士市镇(communes)
  • 列对应瑞士州(cantons)
  • 当某行的市镇隶属于某列的州时,对应位置填1,否则填0
    其中df1是存储市镇与所属州对应关系的参考映射表,df2已提前建好对应行、列索引框架。

原有代码与报错

最初尝试用嵌套循环实现填充逻辑,代码如下:

for row in df2:
    for column in df2.columns:
        if column == df1.loc[row]:
            df2[column] = 1
        else:
            df2[column] = 0

代码运行失败,在df1.loc[row]语句处抛出KeyError: 'ZH'异常。

错误原因
  • 遍历逻辑错误:直接用for row in df2遍历DataFrame时,默认迭代对象是DataFrame的列名,不是行索引。你拿到的第一个遍历值就是州列名ZH,把这个列名传给df1.loc作为行索引查询自然找不到对应行,触发KeyError。
  • 赋值逻辑错误:循环中df2[column] = 1是对整列赋值,不是对单个单元格赋值,就算索引不出错,最终每列只会是全0或全1,完全不符合填充要求。
  • 查询逻辑错误:df1.loc是按行索引取值,如果df1没有把市镇名设为行索引,就算传入正确的市镇名也会触发KeyError。
正确实现方案

推荐方案:向量化实现(无循环,性能最优)

pandas自带的独热编码方法可以直接实现需求,不需要写嵌套循环,数据量大时性能远高于循环写法:

# 注意把代码里的commune、canton替换成df1里实际存储市镇名、州名的列名
# 1. 将df1的市镇列设为索引,取所属州列做独热编码,转成int类型得到0/1矩阵
df2 = pd.get_dummies(df1.set_index('commune')['canton']).astype(int)

循环实现(仅作逻辑参考,不推荐生产环境使用)

如果要保留循环逻辑,需要修正遍历、查询、赋值三个环节的写法:

# 先把市镇和州的映射关系转成字典,查询效率更高
commune_canton_map = df1.set_index('commune')['canton'].to_dict()

# 遍历df2的行索引(即所有市镇名)
for commune_name in df2.index:
    # 拿到当前市镇所属的州
    target_canton = commune_canton_map[commune_name]
    # 遍历所有州列
    for canton_name in df2.columns:
        # 定位到具体单元格赋值
        df2.loc[commune_name, canton_name] = 1 if canton_name == target_canton else 0

内容的提问来源于stack exchange,提问作者benher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:45:15