如何用Python Pandas实现按列表元素匹配合并DataFrame并拼接产品名?
如何实现列表类型ID与产品表关联并拼接产品名称?
针对你这个需求,我给你分享两种用Pandas实现的实用方法,都是日常处理这类嵌套列表关联场景的常用思路:
方法一:映射字典 + apply 快速转换
这种方法适合数据量不大的场景,步骤清晰直接:
- 先从
product表构建ID到产品名称的映射字典,方便快速查找 - 对
sales表的ProductId列应用自定义函数,把每个ID列表转换成对应的产品名称拼接字符串 - 调整列名得到最终结果
import pandas as pd # 模拟你的原始数据 sales = pd.DataFrame({ 'ProductId': [[1], [2], [3,4,5], [6,7,8]], 'Sales': ['$199', '$299', '$399', '$499'] }) product = pd.DataFrame({ 'ID': [1,2,3,4,5,6,7,8], 'Product': ['A','B','C','D','E','F','G','H'] }) # 步骤1:构建ID到Product的映射字典 id_product_map = product.set_index('ID')['Product'].to_dict() # 步骤2:处理ProductId列,拼接产品名称 sales['Product'] = sales['ProductId'].apply( lambda x: ','.join([id_product_map[id] for id in x]) ) # 步骤3:保留需要的列并调整顺序 sales_product = sales[['Product', 'Sales']].reset_index(drop=True) print(sales_product)
运行后就能得到你想要的结果:
Product Sales 0 A $199 1 B $299 2 C,D,E $399 3 F,G,H $499
方法二:explode 展开列表 + 关联 + 分组聚合
这种方法更适合数据量大或者需要更严谨关联校验的场景,能自动处理可能的ID不匹配问题:
- 用
explode把sales表的ProductId列表拆分成多行,每个ID占一行 - 和
product表关联,匹配对应的产品名称 - 按原始的行索引分组,把同一组的产品名称用逗号拼接,再关联回Sales字段
import pandas as pd # 模拟原始数据 sales = pd.DataFrame({ 'ProductId': [[1], [2], [3,4,5], [6,7,8]], 'Sales': ['$199', '$299', '$399', '$499'] }) product = pd.DataFrame({ 'ID': [1,2,3,4,5,6,7,8], 'Product': ['A','B','C','D','E','F','G','H'] }) # 步骤1:展开ProductId列表,保留原始索引 sales_exploded = sales.explode('ProductId', ignore_index=False) # 步骤2:关联product表,匹配产品名称 merged = sales_exploded.merge( product, left_on='ProductId', right_on='ID', how='left' ) # 步骤3:按原始索引分组,拼接产品名称,合并Sales sales_product = merged.groupby(merged.index).agg( Product=('Product', ','.join), Sales=('Sales', 'first') ).reset_index(drop=True) print(sales_product)
这个方法的好处是如果sales里的ID在product表中不存在,会自动填充NaN,方便后续做数据校验。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

