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

基于列表元素部分匹配合并两个Pandas DataFrame

问题描述

我有两个Pandas DataFrame:

主数据df1:

import pandas as pd

df1 = pd.DataFrame(
    data=
    [[['mayor', 'lord'], 25],
     [['prince', 'sheriff'], 33],
     [['king george', 'queen'], 32],
     [['bristol, counsellor'], 43],
     [['exchequer'], 45]],
    columns=['V1', 'V2']
)
df1.update(df1[['V1']].applymap('{}'.format))
print(df1)

另一个DataFrame df2:

df2 = pd.DataFrame(
    data=
    [['mayor', 55],
     ['sheriff', 54],
     ['counsellor', 53],
     ['exchequer', 50]],
    columns=['Var1', 'Var2']
)
print(df2)

我的需求是:如果df1的V1列中(列表格式的元素)包含df2的Var1对应的字符串,就把df2的Var2值映射到主数据中新增的V3列,最终目标DataFrame如下:

dfgoal = pd.DataFrame(
    data=
    [[['mayor', 'lord'], 25, 55],
     [['prince', 'sheriff'], 33, 54],
     [['king george', 'queen'], 32, ],
     [['bristol, counsellor'], 43, 53],
     [['exchequer'], 45, 50]],
    columns=['V1', 'V2', 'V3']
)
dfgoal.update(dfgoal[['V1']].applymap('{}'.format))
print(dfgoal)

我试过一些基于部分字符串匹配的方法,但因为V1是列表对象,匹配可以出现在列表的任意元素中,一直没成功。

解决方案

可以按照以下步骤实现需求:

  1. 先把df2转换成字典,用Var1作为键、Var2作为值,方便快速查找匹配项:
var_map = df2.set_index('Var1')['Var2'].to_dict()
  1. 定义处理函数:遍历V1列表中的每个元素,检查是否包含var_map里的键,找到第一个匹配项就返回对应的值,无匹配则返回空:
def get_matched_value(lst):
    for item in lst:
        for key in var_map:
            if key in item:
                return var_map[key]
    return None
  1. 对df1的V1列应用函数,生成新的V3列:
df1['V3'] = df1['V1'].apply(get_matched_value)

完整代码如下:

import pandas as pd

# 初始化df1
df1 = pd.DataFrame(
    data=
    [[['mayor', 'lord'], 25],
     [['prince', 'sheriff'], 33],
     [['king george', 'queen'], 32],
     [['bristol, counsellor'], 43],
     [['exchequer'], 45]],
    columns=['V1', 'V2']
)
df1.update(df1[['V1']].applymap('{}'.format))

# 初始化df2
df2 = pd.DataFrame(
    data=
    [['mayor', 55],
     ['sheriff', 54],
     ['counsellor', 53],
     ['exchequer', 50]],
    columns=['Var1', 'Var2']
)

# 构建映射字典
var_map = df2.set_index('Var1')['Var2'].to_dict()

# 定义匹配函数
def get_matched_value(lst):
    for item in lst:
        for key in var_map:
            if key in item:
                return var_map[key]
    return None

# 生成V3列
df1['V3'] = df1['V1'].apply(get_matched_value)

print(df1)

执行后得到的结果与目标dfgoal完全一致。

内容的提问来源于stack exchange,提问作者econbuffin2019

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:25:34