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

如何在Pandas中将DataFrame列中的列表与另一个DataFrame关联匹配?

我来帮你搞定这个问题!你用pd.merge踩的坑其实很常见——因为merge是基于整列的单个值来匹配的,而你的LIST_VALUES列是列表类型,根本没法直接和df2里的单个VALUE对应上,所以只有单个元素的行能生效,多元素的自然就匹配不上了。下面是一套完整的解决方案,既能完成映射,还能保留原列表的顺序并去重:

解决方案步骤

1. 先把映射表转成字典(高效查找)

先把df2转换成键值对字典,这样查找映射值的效率会比每次查询DataFrame高很多:

value_map = df2.set_index('VALUE')['MAPPING'].to_dict()

这会生成一个类似{'a': 'alpha', 'b': 'bravo', 'x': 'xray'}的字典,方便快速匹配。

2. 自定义函数处理列表:映射+去重+保持顺序

直接用set去重会打乱原列表的顺序,所以我们写一个小函数,遍历列表时只保留第一次出现的元素,同时完成映射:

def process_list(lst, mapping):
    seen = set()
    mapped_values = []
    for val in lst:
        if val not in seen:
            seen.add(val)
            mapped_values.append(mapping[val])
    return ','.join(mapped_values)

3. 应用函数生成新列

用apply把这个函数应用到LIST_VALUES列的每一行:

df1['new_col'] = df1['LIST_VALUES'].apply(lambda x: process_list(x, value_map))

完整代码+运行结果

把所有代码放在一起运行,就能得到你想要的结果:

import pandas as pd

# 初始化示例数据
df1 = pd.DataFrame({
    'ID': [1, 2, 3, 4],
    'LIST_VALUES': [['a','b','c'], ['a','n','t'], ['x'], ['h','h']]
})

df2 = pd.DataFrame({
    'VALUE': ['a', 'b', 'c', 'n', 'h', 't', 'x'],
    'MAPPING': ['alpha', 'bravo', 'charlie', 'november', 'hotel', 'tango', 'xray']
})

# 生成映射字典
value_map = df2.set_index('VALUE')['MAPPING'].to_dict()

# 定义处理函数
def process_list(lst, mapping):
    seen = set()
    mapped_values = []
    for val in lst:
        if val not in seen:
            seen.add(val)
            mapped_values.append(mapping[val])
    return ','.join(mapped_values)

# 生成新列
df1['new_col'] = df1['LIST_VALUES'].apply(lambda x: process_list(x, value_map))

print(df1)

运行后输出的结果完全符合你的预期:

ID LIST_VALUES                  new_col
0   1  [a, b, c]  alpha,bravo,charlie
1   2  [a, n, t]  alpha,november,tango
2   3        [x]                  xray
3   4     [h, h]                   hotel

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:53:12