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

如何在Pandas中基于包含关系合并两个DataFrame?

实现DataFrame的包含式合并

构造示例数据

先还原你的两个DataFrame:

import pandas as pd

# 构造df_1
df_1 = pd.DataFrame({
    "Nº.do Incidente": ["IN6948271", "IN6948304", "IN6948307", "IN6948309", "IN6948310", "IN6948311"],
    "Status": ["ENCERRADO"]*6,
    "Description": [
        "GR26 D.I.T.I. >>> ABEND NO JOB PP_SASG_GD9822...",
        "GR26 D.I.T.I. >>> ABEND NO JOB PP_AACE_R4539 ...",
        "GR26 D.I.T.I. >>> ABEND NO JOB PP_ADAT_SPRK_EX...",
        "GR26 D.I.T.I. >>> ABEND NO JOB PP_ADAT_SPRK_EX...",
        "GR26 D.I.T.I. >>> ABEND NO JOB PP_ADAT_SPRK_EX...",
        "GR26 D.I.T.I. >>> ABEND NO JOB PP_ADAT_SPRK_EX..."
    ],
    "Per_Extracao": ["DE : 2022/01/05 ATÉ : 2022/12/08"]*6
})

# 构造df_2
df_2 = pd.DataFrame({
    "JOB_NAME": [
        "PP_AACD_NR_D8706_TIHIBRIDA_PROC_EXCUC_D",
        "PP_SASG_GD9822",
        "PP_AACE_R4539",
        "PP_AACE_R4539_CONS_JUNC",
        "PP_AACE_R4539_FMRC_TD_01",
        "PP_AACE_R4539_FMRC_TD_02"
    ],
    "JOB_STREAM_NAME": [
        "P26_AACD_FAC_TOD",
        "P26_AACE_U08",
        "P26_AACE_U09",
        "P26_AACE_U08",
        "P26_AACE_U08",
        "P26_AACE_U08"
    ]
})

解决方案

方法一:遍历匹配关联

这种方法适用于无固定格式的JOB_NAME,只要JOB_NAME完整出现在Description中即可匹配:

# 为每个JOB_NAME找到对应的df_1行索引
matches = df_2.apply(
    lambda row: df_1[df_1["Description"].str.contains(row["JOB_NAME"], na=False)].index,
    axis=1
)

# 展开匹配关系,生成关联表
match_df = pd.DataFrame({
    "df1_index": [idx for sublist in matches for idx in sublist],
    "df2_index": [i for i, sublist in enumerate(matches) for _ in sublist]
})

# 合并得到结果
merged_df = df_1.merge(
    match_df, left_index=True, right_on="df1_index"
).merge(
    df_2, left_on="df2_index", right_index=True
).drop(columns=["df1_index", "df2_index"]).reset_index(drop=True)

方法二:正则提取后精确合并

如果你的JOB_NAME有固定格式(比如都是PP_开头,后续无空格),可以用正则从Description中提取出JOB_NAME,再进行精确合并,效率更高:

# 从Description中提取JOB_NAME(匹配PP_开头直到非空白字符的内容)
df_1["extracted_job"] = df_1["Description"].str.extract(r"(PP_\S+)")

# 和df_2精确合并
merged_df = df_1.merge(df_2, left_on="extracted_job", right_on="JOB_NAME", how="inner").drop(columns=["extracted_job"]).reset_index(drop=True)

结果展示

运行代码后得到的merged_df如下:

Nº.do Incidente     Status                                        Description                          Per_Extracao       JOB_NAME JOB_STREAM_NAME
0       IN6948271  ENCERRADO  GR26 D.I.T.I. >>> ABEND NO JOB PP_SASG_GD9822...  DE : 2022/01/05 ATÉ : 2022/12/08  PP_SASG_GD9822     P26_AACE_U08
1       IN6948304  ENCERRADO  GR26 D.I.T.I. >>> ABEND NO JOB PP_AACE_R4539 ...  DE : 2022/01/05 ATÉ : 2022/12/08   PP_AACE_R4539     P26_AACE_U09

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:48:21