如何用Python多DataFrame实现多条件INDEX/MATCH及聚合需求
解决方案
1. 多条件匹配填充(对应Excel IFNA+INDEX/MATCH逻辑)
核心思路是优先按ID type 2匹配,空值用ID type 1匹配结果填充,用pandas的merge+combine_first实现,完全对应Excel的逻辑:
样例数据准备(方便测试)
import pandas as pd import numpy as np # DF1: ID type1, ID type2, Unit df1 = pd.DataFrame({ 'ID type 1': ['A001', 'A001', 'A002', 'A003'], 'ID type 2': ['B001', 'B002', 'B003', np.nan], 'Unit': [10, 20, 30, 40] }) # DF2: ID type1, ID type2, Tech df2 = pd.DataFrame({ 'ID type 1': ['A001', 'A002', 'A002', 'A003'], 'ID type 2': ['B001', np.nan, 'B003', 'B004'], 'Tech': ['TechX', 'TechY', 'TechZ', 'TechW'] }) # DF3: 核心数据表 df3 = pd.DataFrame({ '日期': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02'], 'ID type 1': ['A001', 'A002', 'A001', 'A003'], 'ID type 2': ['B001', 'B005', np.nan, 'B004'], 'Period': ['P1', 'P2', 'P1', 'P2'], 'output': [100, 200, 150, 300] })
填充Unit*列
# 第一步:按ID type2匹配Unit df3 = df3.merge(df1[['ID type 2', 'Unit']], on='ID type 2', how='left', suffixes=('', '_id2')) # 第二步:按ID type1匹配Unit,填充第一步的空值 id1_unit = df3.merge(df1[['ID type 1', 'Unit']], on='ID type 1', how='left')['Unit'] df3['Unit*'] = df3['Unit'].combine_first(id1_unit) # 清理临时列 df3.drop(columns=['Unit', 'Unit_id2'], inplace=True)
填充Tech*列
逻辑和Unit完全一致,替换成DF2即可:
# 第一步:按ID type2匹配Tech df3 = df3.merge(df2[['ID type 2', 'Tech']], on='ID type 2', how='left', suffixes=('', '_id2')) # 第二步:按ID type1匹配Tech,填充空值 id1_tech = df3.merge(df2[['ID type 1', 'Tech']], on='ID type 1', how='left')['Tech'] df3['Tech*'] = df3['Tech'].combine_first(id1_tech) # 清理临时列 df3.drop(columns=['Tech', 'Tech_id2'], inplace=True)
2. 按维度聚合计算output均值
用groupby按指定维度分组,直接调用mean()计算均值:
# 按日期、ID type1、Tech*、Period分组,计算output均值 agg_result = df3.groupby( ['日期', 'ID type 1', 'Tech*', 'Period'], as_index=False )['output'].mean() # 重命名均值列(可选) agg_result.rename(columns={'output': 'output均值'}, inplace=True)
关键逻辑说明
combine_first:完全对应Excel的IFNA函数,优先取左侧非空值,空值则取右侧值- 两次
merge分别对应Excel中两次INDEX/MATCH的逻辑,先匹配ID type2,再匹配ID type1
内容的提问来源于stack exchange,提问作者Chetan Patel
相关产品推荐
相关产品推荐

