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

Python中基于字符串匹配规则合并两个DataFrame的需求

基于规则合并两个DataFrame的实现方案

问题背景

我有两个Python pandas DataFrame:

  • df1数据:
ID      Limit       Comment
12      200         ['Normal']
23      202         ['Emergency']
23      203         ['Normal']
43      304         ['Emergency']
12      500         ['Emergency']
24      100         ['Emergency']
  • df2数据:
Name          Title      ID     Limit Type
BASE CASE     title1     12      X
NOT_BASE      title12    23      N
NOT_BASE_1    title 23   43      X
BASE CASE     title 23   23      X
NOT_BASE_2    title23    12      X

需求:基于ID合并两个DataFrame,遵循以下规则:

  • 当df2的Name列为BASE CASE时,选取df1中Comment为['Normal']对应的Limit值
  • 当df2的Name列为非BASE CASE时,选取df1中Comment为['Emergency']对应的Limit值

期望输出df3:

Name          Title      ID     Limit Type   Limit
BASE CASE     title1     12      X           200
NOT_BASE      title12    23      N           202
NOT_BASE_1    title 23   43      X           304
BASE CASE     title 23   23      X           203
NOT_BASE_2    title23    12      X           500

实现代码

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'ID': [12,23,23,43,12,24],
    'Limit': [200,202,203,304,500,100],
    'Comment': [['Normal'], ['Emergency'], ['Normal'], ['Emergency'], ['Emergency'], ['Emergency']]
})

df2 = pd.DataFrame({
    'Name': ['BASE CASE', 'NOT_BASE', 'NOT_BASE_1', 'BASE CASE', 'NOT_BASE_2'],
    'Title': ['title1', 'title12', 'title 23', 'title 23', 'title23'],
    'ID': [12,23,43,23,12],
    'Limit Type': ['X', 'N', 'X', 'X', 'X']
})

# 提取Comment列表中的字符串内容,方便匹配
df1['Comment_str'] = df1['Comment'].apply(lambda x: x[0])

# 拆分df1为Normal和Emergency两个子表
df_normal = df1[df1['Comment_str'] == 'Normal'][['ID', 'Limit']].rename(columns={'Limit': 'Normal_Limit'})
df_emergency = df1[df1['Comment_str'] == 'Emergency'][['ID', 'Limit']].rename(columns={'Limit': 'Emergency_Limit'})

# 将两个子表合并到df2
df_merged = df2.merge(df_normal, on='ID', how='left').merge(df_emergency, on='ID', how='left')

# 根据Name列规则选择对应Limit值
df_merged['Limit'] = df_merged.apply(
    lambda row: row['Normal_Limit'] if row['Name'] == 'BASE CASE' else row['Emergency_Limit'],
    axis=1
)

# 清理中间列,得到最终结果
df3 = df_merged.drop(columns=['Normal_Limit', 'Emergency_Limit', 'Comment_str'], errors='ignore')

print(df3)

代码说明

  1. 处理Comment列:原数据中Comment是列表格式,提取列表内的字符串,简化后续筛选逻辑
  2. 拆分df1:将df1拆分为两个子表,分别存储Normal和Emergency对应的Limit值,避免合并时冲突
  3. 合并数据:将两个子表依次与df2合并,确保每个ID能匹配到两种场景下的Limit值
  4. 规则匹配:通过apply函数根据Name列的取值,选择对应的Limit值填充新列
  5. 清理结果:删除中间过程产生的冗余列,得到符合要求的最终DataFrame

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:30:19