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

Pandas中df.replace()如何批量匹配多组键值实现替换?

高效批量替换DataFrame多组字符串的解决方案

问题背景

有如下结构的DataFrame:

name     status  pos
0    Air TU   D       jan
1    AirTU N  L       dec
2    Air-TU   D       feb
3    NorTU.   L       jan
4    KolTU.   N       feb
...

需要完成三类替换:

  • 将name列中Air TU、AirTU N、Air-TU等变体统一替换为AirTU
  • status列的D替换为I
  • pos列的Jan替换为Nov

初始写法需要逐个枚举name列的变体,变体数量多时过于繁琐:

df.replace({'status': {'D': 'I'},
            'pos': {'Jan':'Nov'},
            'name': {'Air TU': 'AirTU', 'Air-TU':'AirTU', 'AirTU N':'AirTU' }})

尝试用frozenset或tuple分组匹配时均失败:

  • frozenset写法无报错但未执行替换:
df.replace({'status': {'D': 'I'},
            'pos': {'Jan':'Nov'},
            'name': { frozenset({'Air TU','Air-TU','AirTU N'}) :'AirTU' }})
  • tuple写法抛出维度不匹配错误:
df.replace({'status': {'D': 'I'},
            'pos': {'Jan':'Nov'},
            'name': { tuple({'Air TU','Air-TU','AirTU N'}) :'AirTU' }})

错误信息:

ValueError: operands could not be broadcast together with shapes (6803,) (2,) 

可行方案

方案1:字典推导式生成批量映射

利用字典推导式自动生成name列的替换规则,避免手动逐个输入变体:

# 定义所有需要替换的AirTU变体
airtu_variants = ['Air TU', 'Air-TU', 'AirTU N']

# 构建完整替换规则
replace_rules = {
    'status': {'D': 'I'},
    'pos': {'Jan': 'Nov'},
    'name': {var: 'AirTU' for var in airtu_variants}
}

# 执行替换
df = df.replace(replace_rules)

这种方式简洁易维护,变体数量增加时只需修改airtu_variants列表即可。

方案2:正则表达式模糊匹配(适合变体有规律的场景)

如果变体存在统一规律(比如包含AirTU核心字符,仅分隔符或后缀不同),可以用正则表达式一次性匹配所有变体:

# 替换name列的所有AirTU变体
df['name'] = df['name'].replace(
    r'^Air(?:\s|-)?TU(?:\sN)?$', 
    'AirTU', 
    regex=True
)

# 处理其他列替换
df['status'] = df['status'].replace('D', 'I')
df['pos'] = df['pos'].replace('Jan', 'Nov')

正则表达式说明:

  • ^Air(?:\s|-)?TU:匹配以Air开头,可选空格或短横线后接TU的字符串
  • (?:\sN)?:可选匹配末尾的 N后缀
  • 该正则会匹配Air TU、Air-TU、AirTU、AirTU N等所有相关变体

方案3:isin+where批量替换

通过isin判断值是否属于变体列表,再用where统一替换:

airtu_variants = ['Air TU', 'Air-TU', 'AirTU N']

# 替换name列
df['name'] = df['name'].where(
    ~df['name'].isin(airtu_variants), 
    'AirTU'
)

# 处理其他列
df['status'] = df['status'].replace('D', 'I')
df['pos'] = df['pos'].replace('Jan', 'Nov')

逻辑直观,适合明确知道所有变体的场景,执行效率也较高。


内容的提问来源于stack exchange,提问作者Domarius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:56:28