Pandas如何基于列表元素匹配合并两个DataFrame数据框
Pandas两个DataFrame按列表元素匹配合并实现方案
需求说明
现有两个DataFrame:
- df1包含分组标识
Groups、数值列Value1/Value2、以及存储sp列表的List_sp列 - df2包含分组标识
Groups、单条sp记录列sp
需要将df1的数值匹配到df2中对应sp的行,匹配规则为:df2的sp值存在于df1对应分组的List_sp列表中。
前置准备:构造测试数据
你提供的字典标注存在错位,修正后构造正确的测试数据如下:
import pandas as pd # 构造df1 df1 = pd.DataFrame({ 'Groups': ['G1', 'G1', 'G2', 'G2'], 'Value1': [2, 4, 6, 8], 'Value2': [3, 5, 7, 9], 'List_sp': [ ['Segment_1_1-300_+__Sp1', 'Segment_2_301-400_-__Sp2'], ['Segment_3_400-500_+__Sp3', 'Segment_2_600-700_+__Sp4'], ['Segment_12_800-900_-__Sp1'], ['Segment_1_400-500_-__Sp3', 'Segment_7_600-900_+__Sp1', 'Segment_15_1000-1900_-__Sp1'] ] }) # 构造df2,你提供的标注为"df1字典"的内容实际对应df2的结构 df2 = pd.DataFrame({ 'Groups': {0: 'G1', 1: 'G1', 2: 'G1', 3: 'G1', 4: 'G2', 5: 'G2', 6: 'G2', 7: 'G2'}, 'sp': {0: 'Segment_1_1-300_+__Sp1', 1: 'Segment_2_301-400_-__Sp2', 2: 'Segment_3_400-500_+__Sp3', 3: 'Segment_2_600-700_+__Sp4', 4: 'Segment_12_800-900_-__Sp1', 5: 'Segment_1_400-500_-__Sp3', 6: 'Segment_7_600-900_+__Sp1', 7: 'Segment_15_1000-1900_-__Sp1'} })
实现逻辑
- 把df1的
List_sp列展开,让列表中的每个sp单独成为一行 - 用展开后的df1和df2,按
Groups和sp字段匹配合并即可得到目标结果
完整实现代码
# 展开df1的List_sp列,一行对应一个sp df1_exploded = df1.explode('List_sp', ignore_index=True) # 按分组和sp匹配合并两个表 result = pd.merge( df2, df1_exploded, left_on=['Groups', 'sp'], right_on=['Groups', 'List_sp'], how='left' ) # 调整列顺序为预期输出格式 result = result[['Groups', 'sp', 'Value1', 'Value2', 'List_sp']] # 验证结果 print(result)
运行代码得到的输出和你给出的预期结果完全一致,可直接使用。
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

