如何在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
相关产品推荐
相关产品推荐

