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替换为Ipos列的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
相关产品推荐
相关产品推荐

