如何更Pythonic地批量替换Pandas DataFrame中的多行内容?
Pandas高效替换分类值的方法
需求说明
我的Pandas DataFrame共428行1列,前5行数据如下:
0 Stage II 1 Stage III 2 Stage II 3 Stage IV 4 Stage II
需要将其中的"Stage I/II/III/IV"分别替换为"Grade I/II/III/IV",目标结果:
0 Grade II 1 Grade III 2 Grade II 3 Grade IV 4 Grade II
之前尝试过逐个调用replace(需重复4次),以及用iterrows遍历替换(未生效),下面给出更Pythonic的解决方案:
为什么iterrows方法失效?
iterrows()返回的是**(索引, 行数据)**的元组,不是单个字符串,所以你的判断条件row == "Stage I"永远不成立;另外,就算拿到行数据,直接调用replace不赋值也不会修改原DataFrame,嵌套if的逻辑也存在错误(应该用elif或独立判断)。
推荐的Pythonic实现方法
方法1:字典映射批量替换(最推荐)
直接给replace传入替换字典,一次性完成所有映射,代码简洁且高效:
# 定义替换规则字典 replace_map = { "Stage I": "Grade I", "Stage II": "Grade II", "Stage III": "Grade III", "Stage IV": "Grade IV" } # 替换(修改原DataFrame) target_data.replace(replace_map, inplace=True) # 或者返回新DataFrame(不修改原数据) new_data = target_data.replace(replace_map)
方法2:字符串批量替换(更灵活)
因为所有替换都是将"Stage"替换为"Grade",可以直接用str.replace做全局字符串替换,无需逐个枚举分类:
# 假设列名为0,替换后赋值回原列 target_data[0] = target_data[0].str.replace("Stage", "Grade") # 如果有自定义列名,比如"stage",则改为: # target_data["stage"] = target_data["stage"].str.replace("Stage", "Grade")
这种方法的优势是:新增类似"Stage V"的分类时,无需修改代码即可自动替换。
方法3:map函数映射
利用map方法结合字典完成替换,适合需要严格匹配的场景:
target_data[0] = target_data[0].map(replace_map)
注意:map会将不在字典中的值转为NaN,如果需要保留原数据中的其他值,可以添加fillna:
target_data[0] = target_data[0].map(replace_map).fillna(target_data[0])
为什么这些方法更Pythonic?
这些方法都利用了Pandas的向量化操作,避免了低效的循环遍历,在数据量较大时(比如你的428行)效率远高于iterrows,同时代码更简洁、可读性更强。
内容的提问来源于stack exchange,提问作者kukulu
相关产品推荐
相关产品推荐

