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

结合pd.loc与pd.iloc为DataFrame赋值异常的原因咨询

pandas loc赋值写法差异说明

首先明确核心规则:DataFrame.loc的第二个参数用于指定需要操作的列,仅支持传入列名字符串、列名组成的列表、或和列维度匹配的布尔筛选序列,不符合规则的入参会触发pandas的自动列生成逻辑。

两种正确写法的运行逻辑

  • 第一种写法:dd.loc[dd.iloc[:,1]==0,['result_'+cv_detail[0]] ] = 'Other'
    动态拼接得到的['result_ICV']是列名组成的列表,属于合法的列指定入参,pandas会直接定位到result_ICV列,给满足行筛选条件的位置赋值Other,运行正常。
  • 第二种写法:dd.loc[dd.sum_result_ICV == 0, "result_ICV"] = 'Other'
    直接传入列名字符串"result_ICV",也是loc支持的标准列指定方式,逻辑和第一种完全一致,仅列名是写死而非动态生成,所以也能正常赋值。

错误写法的问题分析

dd.loc[dd.iloc[:,1]==0, dd.iloc[:,3]] = 'Other'的问题出在第二个入参dd.iloc[:,3]:
dd.iloc[:,3]取的是result_ICV列的整列数值,而不是列名。你的测试代码中result_ICV初始值全为0,所以dd.iloc[:,3]返回的是一个值全为0的Series。
pandas无法将这个数值Series识别为列名,会将Series的取值作为新列名自动创建新列,最终你会看到多了一个名为0的新列,赋值操作也只会作用在这个新列上,自然无法修改result_ICV的内容。

位置选列的正确实现

如果你需要通过列的位置索引来指定赋值列,可以把位置转换为列名再传入:

# dd.columns[3] 拿到第4列(索引从0开始)的列名 result_ICV
dd.loc[dd.iloc[:,1]==0, dd.columns[3]] = 'Other'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:36:01