如何用Python Pandas编写函数遍历多DataFrame并按条件计算结果
批量处理Pandas DataFrame实现时段数值匹配计算
问题背景
需要替代Excel静态的INDEX+MATCH方案,批量处理大规模多日期、多单元的Pandas DataFrame数据:基于Efficiency Quintile匹配两个结构不同的DF(DF1、DF2),将DF1中各时段的数值乘以DF2对应的Efficiency_adjusted_EF系数,最终生成包含MODELLED Rank、BM_Unit及计算后时段值的结果集DF3。
假设数据结构
先明确两个DF的典型结构(可根据实际情况调整字段名):
- DF1:包含
Date、BM_Unit、Efficiency_Quintile,以及Period_1到Period_10等时段数值列 - DF2:匹配参数表,包含
Efficiency_Quintile、Efficiency_adjusted_EF、MODELLED_Rank
实现步骤与代码
import pandas as pd def calculate_modelled_results(df1, df2): # 统一匹配键数据类型,避免关联失败 df1['Efficiency_Quintile'] = df1['Efficiency_Quintile'].astype(str) df2['Efficiency_Quintile'] = df2['Efficiency_Quintile'].astype(str) # 关联两个DF,获取调整系数和MODELLED Rank merged_df = pd.merge( df1, df2[['Efficiency_Quintile', 'Efficiency_adjusted_EF', 'MODELLED_Rank']], on='Efficiency_Quintile', how='left' ) # 批量计算各时段的调整后数值 period_cols = [col for col in df1.columns if col.startswith('Period_')] for col in period_cols: merged_df[f'Adjusted_{col}'] = merged_df[col] * merged_df['Efficiency_adjusted_EF'] # 整理生成目标DF3,保留所需字段 df3 = merged_df[['MODELLED_Rank', 'BM_Unit'] + [f'Adjusted_{col}' for col in period_cols]] return df3
代码说明
- 类型统一:将
Efficiency_Quintile转为字符串类型,避免因整数/字符串类型不匹配导致的关联失效 - 高效关联:使用
pd.merge替代Excel的INDEX+MATCH,支持批量关联大规模数据 - 批量计算:通过遍历时段列实现批量乘法,无需逐个列手动编写计算逻辑
- 结果整理:按需筛选字段,生成符合要求的DF3
使用示例
# 模拟测试数据 df1 = pd.DataFrame({ 'Date': ['2024-01-01']*3, 'BM_Unit': ['Unit_A', 'Unit_B', 'Unit_C'], 'Efficiency_Quintile': ['1', '3', '5'], 'Period_1': [100, 200, 300], 'Period_2': [150, 250, 350] }) df2 = pd.DataFrame({ 'Efficiency_Quintile': ['1', '2', '3', '4', '5'], 'Efficiency_adjusted_EF': [0.8, 0.9, 1.0, 1.1, 1.2], 'MODELLED_Rank': ['Rank_1', 'Rank_2', 'Rank_3', 'Rank_4', 'Rank_5'] }) # 运行函数 df3 = calculate_modelled_results(df1, df2) print(df3)
输出示例
MODELLED_Rank BM_Unit Adjusted_Period_1 Adjusted_Period_2 0 Rank_1 Unit_A 80.0 120.0 1 Rank_3 Unit_B 200.0 250.0 2 Rank_5 Unit_C 360.0 420.0
内容的提问来源于stack exchange,提问作者Chetan Patel
相关产品推荐
相关产品推荐

