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

Pandas跨DataFrame匹配映射替换列表列内对应元素

Pandas 别名批量替换高效实现方案

核心思路

不要采用逐行嵌套遍历匹配的低效写法,优先构建哈希映射表实现常数时间查找,整体时间复杂度为线性,是大数据量下性能最优的实现方式。

实现步骤

  • 先从df1提取所有别名和对应标准名,构建别名:标准名的字典,一次构建可重复使用
  • 遍历df2中每个水果列表,通过字典查表完成替换,未匹配到的元素保留原值

完整代码

import pandas as pd

# --------------------------
# 1. 构造样例数据(已有df1/df2可跳过这部分)
# --------------------------
df1 = pd.DataFrame({
    'name': ['a.apple', 't.orange', 'ts.grape', 'u.berryCool'],
    'duplicates': [
        ['b.apple', 'c.apple'],
        ['arr.orange', 'pg.orange'],
        ['a.grape', 'test.grape'],
        ['X.berryCool', 'cool.berryCool']
    ]
})

df2 = pd.DataFrame({
    'people': ['jack', 'mary', 'andy', 'lawrence'],
    'fruits': [
        ['b.apple', 'c.apple', 'pp.tomato', 'ao.banana'],
        ['arr.orange', 'b.apple', 'X.berryCool', 'op.mango'],
        ['cool.berryCool', 'test.grape', 'yu.papaya'],
        ['jc.orange', 'c.apple']
    ]
})

# --------------------------
# 2. 核心替换逻辑
# --------------------------
# 构建别名映射字典
alias_map = {}
for std_name, alias_list in zip(df1['name'], df1['duplicates']):
    for alias in alias_list:
        alias_map[alias] = std_name

# 批量替换fruits列
df2['fruits'] = df2['fruits'].apply(lambda x: [alias_map.get(item, item) for item in x])

结果验证

执行后打印df2,匹配逻辑完全符合需求:匹配到别名的元素替换为对应标准名,未匹配元素保留原值,输出结果如下:

people                                        fruits
0      jack      [a.apple, a.apple, pp.tomato, ao.banana]
1      mary  [t.orange, a.apple, u.berryCool, op.mango]
2      andy       [u.berryCool, ts.grape, yu.papaya]
3  lawrence                     [jc.orange, a.apple]

性能说明

  • 该方案避免了嵌套遍历DataFrame的低效写法,字典查找的时间复杂度为O(1),整体处理效率比逐行匹配df1的写法高1~2个数量级,数据量越大优势越明显。
  • 如果存在同一个别名对应多个标准名的场景,可在构建alias_map时增加优先级判断逻辑,默认按df1的行顺序,后出现的同别名映射会覆盖先出现的映射,可根据业务需求调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:27:09