pandas for循环遍历DataFrame行.loc赋值触发ValueError问题
报错根本原因
报错和混合使用数值、字符串索引无关,核心问题是你筛选得到的region变量是pandas Series对象,不是单个标量值,无法直接赋值给df2的单个单元格。
你写的筛选逻辑df1.loc[(df1["code"] == 匹配值), "region"]哪怕只匹配到1条记录,返回的依然是带原生索引的Series结构,例如匹配code为AFG的行时,拿到的region实际内容是:
0 Middle East Name: region, dtype: object
而非直接的Middle East字符串。你之前把这个Series存到变量里不会触发报错,只有在尝试把整个Series赋值给单个单元格时,pandas才会抛出类型不兼容的错误。
修正后的循环实现
只需要在筛选region后,提取匹配到的标量值再赋值即可,两种遍历方式的修正代码如下:
- range遍历版本
for i in range(len(df2)): # .item() 提取唯一匹配的标量值 region = df1.loc[df1["code"] == df2.loc[i, "code"], "region"].item() df2.loc[i, "region"] = region
- iterrows遍历版本
for index, row in df2.iterrows(): region = df1.loc[df1["code"] == row["code"], "region"].item() df2.loc[index, "region"] = region
优化建议
如果你的df1中每个code唯一对应一个region(样例数据满足该条件),完全不需要写循环,性能更高的写法是先构建code到region的映射字典,再通过map直接整列赋值:
# 构建映射关系 code_region_map = dict(zip(df1["code"], df1["region"])) # 一次性生成整列region df2["region"] = df2["code"].map(code_region_map)
注意:如果df1中存在同一个code对应多条region记录的情况,
.item()会抛出错误,这种场景可以把.item()替换为.iloc[0],取第一条匹配到的region值即可。
内容的提问来源于stack exchange,提问作者asuidncsdk
相关产品推荐
相关产品推荐

