Python如何修改DataFrame某一列的值而不影响其他列的内容?
错误原因
你遇到这个问题的核心原因是使用了链式索引(renombrada.SEXO.loc[...]这种写法),这是pandas中明确不推荐的操作方式:
链式索引操作时,pandas无法保证返回的是原DataFrame的视图还是副本,修改操作的作用范围会出现不可预期的行为,你遇到的全表1被替换就是典型的副作用,大多数情况下该操作还会触发SettingWithCopyWarning警告。
修正方案1:调整loc用法,避免链式索引
loc本身支持同时指定行条件和列名,直接在原DataFrame上做定位修改,不会出现范围溢出:
# 替换SEXO列的值 renombrada.loc[renombrada.SEXO == 1, 'SEXO'] = "Varón" renombrada.loc[renombrada.SEXO == 2, 'SEXO'] = "Mujer" # 替换NIVEL_EDUCATIVO列的值 renombrada.loc[renombrada.NIVEL_EDUCATIVO == 1, 'NIVEL_EDUCATIVO'] = "Primario incompleto" renombrada.loc[renombrada.NIVEL_EDUCATIVO == 2, 'NIVEL_EDUCATIVO'] = "Primario completo" renombrada.loc[renombrada.NIVEL_EDUCATIVO == 3, 'NIVEL_EDUCATIVO'] = "Secundario incompleto"
修正方案2:使用replace批量映射(更推荐)
对于固定数值到文本的映射场景,直接给对应列传入映射字典即可,不需要逐行判断,代码更简洁高效:
# 定义各列的映射规则 sexo_map = {1: "Varón", 2: "Mujer"} educacion_map = { 1: "Primario incompleto", 2: "Primario completo", 3: "Secundario incompleto" } # 批量替换 renombrada['SEXO'] = renombrada['SEXO'].replace(sexo_map) renombrada['NIVEL_EDUCATIVO'] = renombrada['NIVEL_EDUCATIVO'].replace(educacion_map)
如果不需要保留映射规则外的原值,也可以将replace方法替换为map方法,用法完全一致。
内容的提问来源于stack exchange,提问作者VioleC
相关产品推荐
相关产品推荐

