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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:18:14