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

如何更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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:15:20