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)
代码说明
- 处理Comment列:原数据中
Comment是列表格式,提取列表内的字符串,简化后续筛选逻辑 - 拆分df1:将df1拆分为两个子表,分别存储
Normal和Emergency对应的Limit值,避免合并时冲突 - 合并数据:将两个子表依次与df2合并,确保每个ID能匹配到两种场景下的Limit值
- 规则匹配:通过
apply函数根据Name列的取值,选择对应的Limit值填充新列 - 清理结果:删除中间过程产生的冗余列,得到符合要求的最终DataFrame
内容的提问来源于stack exchange,提问作者S_Scouse
相关产品推荐
相关产品推荐

