基于字典替换Pandas DataFrame列值无效果问题排查求助
解决Pandas DataFrame.replace()未修改原数据的问题
你的问题核心在于Pandas的replace()方法默认不会原地修改原数据——它会返回一个新的Series/DataFrame对象,如果你没有把这个结果赋值回原列,或者没有使用inplace=True参数,原数据自然不会发生变化。
先看你的简化示例问题
你原来的代码:
for key, value in newVals.items(): df1['A'].replace({key: value})
这段代码每次调用replace()都会生成一个新的Series,但你没有把它赋值回df1['A'],也没让修改在原对象上生效。可以改成两种方式:
方式1:赋值回原列(更推荐,避免原地修改的副作用)
import pandas as pd df1 = pd.DataFrame({'A':['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}) newVals = {'A0': 0, 'A1': 1, 'A2': 2, 'A3': 3} # 直接传入整个字典,一次完成替换,赋值回原列 df1['A'] = df1['A'].replace(newVals)
方式2:使用inplace=True参数原地修改
df1['A'].replace(newVals, inplace=True)
再修正你的完整流程代码
你的第4步是问题重灾区:没必要循环字典的key-value对,直接把整个映射字典传给replace()即可,同时要确保修改生效。修改后的代码如下:
iterator = 0 for item in mapList: code = code_list[iterator] col_name = code_to_column[code] # 直接传入整个映射字典,赋值回原列完成替换 osha_accident_injury[col_name] = osha_accident_injury[col_name].replace(item) iterator += 1
额外的代码优化建议
为了让你的代码更简洁高效,还可以优化前面的步骤:
- 提取唯一accident_code的更简洁写法
# 直接用unique()获取唯一值,转成列表 code_list = osha_accident_lookup['accident_code'].unique().tolist() # 批量移除不需要的代码 codes_to_remove = ['PTYP', 'COST', 'ENDU'] code_list = [code for code in code_list if code not in codes_to_remove]
- 创建映射字典列表的简化写法
用列表推导式替代循环,更简洁:
mapList = [ dict(zip( osha_accident_lookup[osha_accident_lookup['accident_code'] == code]['accident_number'], osha_accident_lookup[osha_accident_lookup['accident_code'] == code]['accident_value'] )) for code in code_list ]
这样修改后,你的编码替换操作就能正常生效了。
内容的提问来源于stack exchange,提问作者JamesDockett
相关产品推荐
相关产品推荐

