pandas使用DataFrame.loc更新列值失败原因及正确实现方案
问题原因
你编写的赋值代码触发了pandas的DataFrame列名自动对齐规则:当你将一个DataFrame赋值给另一个DataFrame的切片时,pandas会优先匹配两边的列名再完成赋值,而非按列的位置顺序赋值。你左侧赋值目标的列是c1、c2,右侧待赋值的DataFrame列是_c1、_c2,两边列名完全不匹配,找不到对应关系就会将目标位置填充为NaN,和你的预期结果不符。
正确实现方式
下面提供3种常用的可运行方案:
- 方案1:提取右侧的numpy数组赋值,跳过列名对齐逻辑(最简洁)
data.loc[~data['_c1'].isna(), ['c1','c2']] = data.loc[~data['_c1'].isna(), ['_c1','_c2']].values
.values会将右侧DataFrame转为纯数值数组,按位置顺序对应赋值给左侧的两列,不会触发列名对齐规则。
- 方案2:重命名右侧列名后赋值
# 将右侧列名修改为和左侧目标列一致,触发列名匹配后完成赋值 data.loc[~data['_c1'].isna(), ['c1','c2']] = data.loc[~data['_c1'].isna(), ['_c1','_c2']].rename(columns={'_c1':'c1', '_c2':'c2'})
- 方案3:使用pandas的update方法完成覆盖更新
# 提取需要更新的片段、重命名列后调用update方法覆盖原表对应位置 update_slice = data.loc[~data['_c1'].isna(), ['_c1','_c2']].rename(columns={'_c1':'c1', '_c2':'c2'}) data.update(update_slice)
内容的提问来源于stack exchange,提问作者nbk
相关产品推荐
相关产品推荐

