在Pandas中实现Excel同款同环境进程对比%improve列的技术疑问
在Pandas中实现同环境进程性能对比与%improve列计算
核心逻辑
先按环境字段分组,每组内确保进程顺序(比如旧版本在前、新版本在后),再计算当前进程与同组上一条进程的性能差异百分比,完全匹配你要的Excel功能。
假设你的DataFrame结构示例:
import pandas as pd df = pd.DataFrame({ '环境': ['测试环境A', '测试环境A', '生产环境B', '生产环境B'], '进程': ['旧版本进程', '新版本进程', '旧版本进程', '新版本进程'], '性能指标': [100, 80, 200, 150] # 示例为耗时,数值越小性能越好 })
填充BuildTable函数的实现代码
方案1:分组+shift计算(直观易读)
def BuildTable(df): # 按环境分组,每组内按进程排序(保证基准进程在前) df = df.sort_values(['环境', '进程'], ascending=[True, True]) # 计算同环境下与上一条的性能提升百分比 df['%improve'] = df.groupby('环境')['性能指标'].apply( lambda x: (x.shift(1) - x) / x.shift(1) * 100 ).round(2) # 填充组内第一条无对比数据的空值 df['%improve'] = df['%improve'].fillna('-') return df
方案2:transform简化写法(高效简洁)
def BuildTable(df): df = df.sort_values(['环境', '进程']) # 分组获取同环境的上一条性能指标 prev_perf = df.groupby('环境')['性能指标'].shift(1) # 计算提升百分比,处理异常值 df['%improve'] = ((prev_perf - df['性能指标']) / prev_perf * 100).round(2) df['%improve'] = df['%improve'].replace([pd.NA, float('inf'), float('-inf')], '-') return df
关键细节说明
- 分组规则:必须以
环境为分组键,避免跨环境对比 - 排序要求:如果原始数据中进程顺序混乱,一定要先排序,确保对比基准(比如旧版本)在每组的第一条
- 指标适配:如果你的性能指标是吞吐量(数值越大越好),公式需调整为
(x - x.shift(1))/x.shift(1)*100 - 空值处理:每组第一条无前置数据,用
-或其他标识填充更符合业务展示需求
示例输出
运行函数后得到的结果:
| 环境 | 进程 | 性能指标 | %improve |
|---|---|---|---|
| 测试环境A | 旧版本进程 | 100 | - |
| 测试环境A | 新版本进程 | 80 | 20.00 |
| 生产环境B | 旧版本进程 | 200 | - |
| 生产环境B | 新版本进程 | 150 | 25.00 |
内容的提问来源于stack exchange,提问作者h ca
相关产品推荐
相关产品推荐

