Pandas如何将列表列元素关联匹配另一DataFrame对应值
pandas 列表字段关联匹配映射实现
原始数据结构
现有两个DataFrame:
df1的y_id列存储整数ID构成的列表df2存储y_id和对应y_name的一一映射关系
import pandas as pd df1 = pd.DataFrame({ 'x_id': [1, 2, 3], 'y_id': [[101,102,103], [102, 103], [103]] }) df2 = pd.DataFrame({ 'y_id': [101, 102, 103], 'y_name': ['abc', 'xyz', 'def'] })
目标输出
需要新增y_names列,按y_id列表的顺序存储匹配到的名称,最终得到df3结构如下:
x_id y_id y_names 0 1 [101, 102, 103] [abc, xyz, def] 1 2 [102, 103] [xyz, def] 2 3 [103] [def]
之前使用lookup、普通apply写法未得到预期结果,可使用以下两种方案实现:
方案1:字典映射+列表推导(推荐,小数据量性能最优)
先把df2转成ID到名称的映射字典,再逐行遍历y_id列表匹配值,避免逐行查表的性能损耗:
# 构建映射字典 y_id2name = df2.set_index('y_id')['y_name'].to_dict() # 生成匹配后的名称列表列 df1['y_names'] = df1['y_id'].apply(lambda ids: [y_id2name[i] for i in ids]) df3 = df1
若存在
df1里的y_id不在df2中的场景,可将匹配逻辑改为y_id2name.get(i, '默认值'),避免抛出KeyError。
方案2:explode展开后聚合(逻辑直观,大数据量稳定)
先把列表列展开为行,和df2做普通关联匹配,再按x_id聚合回列表格式,不需要写自定义遍历逻辑:
df3 = df1.explode('y_id')\ .merge(df2, on='y_id', how='left')\ .groupby('x_id', as_index=False)\ .agg(y_id=('y_id', list), y_names=('y_name', list))
两种方案输出结果完全一致,可根据自己的数据量和代码习惯选择。
内容的提问来源于stack exchange,提问作者Lijju Mathew
相关产品推荐
相关产品推荐

