如何批量计算两个DataFrame中各REF分组的数值百分比差异?
批量计算多REF的月度百分比差异
核心思路
先分别对两个月的数据按REF分组求和,合并后统一计算百分比差异,一次性处理所有REF,无需逐个操作。
具体实现步骤
1. 分组求和月度数据
先把9月(df1)和10月(df2)的数据按REF分组,计算每个REF的月度总值:
import pandas as pd import numpy as np # 9月数据分组求和 df1_sum = df1.groupby('REF')['value'].sum().reset_index(name='sep_value') # 10月数据分组求和 df2_sum = df2.groupby('REF')['value'].sum().reset_index(name='oct_value')
2. 合并月度汇总表
按REF合并两个汇总表,用outer连接确保所有REF都被包含,缺失值填充为0避免计算报错:
merged_df = pd.merge(df1_sum, df2_sum, on='REF', how='outer').fillna(0)
3. 计算百分比差异
用np.where处理分母为0的特殊情况,百分比差异公式为((10月值-9月值)/9月值)*100:
merged_df['pct_diff'] = np.where( merged_df['sep_value'] == 0, # 9月值为0时,若10月也为0则差异为0,否则标记为无穷大(可按需调整) np.where(merged_df['oct_value'] == 0, 0, np.inf), ((merged_df['oct_value'] - merged_df['sep_value']) / merged_df['sep_value']) * 100 )
4. 格式化输出指定格式
把结果整理成REF名称 百分比的格式,保留两位小数:
merged_df['formatted_result'] = merged_df.apply( lambda row: f"{row['REF']} {row['pct_diff']:.2f}%", axis=1 ) # 打印所有结果 print('\n'.join(merged_df['formatted_result']))
完整模拟示例
假设你的数据结构如下,运行代码即可得到目标输出:
# 模拟测试数据 df1 = pd.DataFrame({ 'REF': ['REF1', 'REF1', 'REF2', 'REF3'], 'value': [100, 200, 500, 300] }) df2 = pd.DataFrame({ 'REF': ['REF1', 'REF2', 'REF2', 'REF3'], 'value': [300, 501.55, 0, 290] }) # 执行上述步骤 df1_sum = df1.groupby('REF')['value'].sum().reset_index(name='sep_value') df2_sum = df2.groupby('REF')['value'].sum().reset_index(name='oct_value') merged_df = pd.merge(df1_sum, df2_sum, on='REF', how='outer').fillna(0) merged_df['pct_diff'] = np.where( merged_df['sep_value'] == 0, np.where(merged_df['oct_value'] == 0, 0, np.inf), ((merged_df['oct_value'] - merged_df['sep_value']) / merged_df['sep_value']) * 100 ) merged_df['formatted_result'] = merged_df.apply( lambda row: f"{row['REF']} {row['pct_diff']:.2f}%", axis=1 ) print('\n'.join(merged_df['formatted_result']))
输出结果:
REF1 0.00% REF2 0.31% REF3 -3.33%
内容的提问来源于stack exchange,提问作者Ryan1234
相关产品推荐
相关产品推荐

