You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python pandas按日期分组按ID拆分列计算比值与筛选数据

Pandas分组计算同组A/B类指标比值+偏差筛选方案

你之前拆分A、B子集排序再做除法的写法有两个明显问题:一是逐列写计算逻辑冗余度高,二是如果排序逻辑没对齐分组键,很容易出现行错位导致计算结果错误。用透视转换把同组A、B指标对齐到同一行后批量计算,是效率最高也最不容易出错的写法,不需要逐列硬编码逻辑。


完整实现代码

import pandas as pd

# 加载原始数据
data = {'Result1':[10, 11, 12, 44],
'Result2':[6, 7, 55, 114],
    'ID':['A', 'B', 'A', 'B'],
    'anoter_id':["one", "one", "two", "two"],
    'date' : ['2022-06-06', '2022-06-06', '2022-06-01', '2022-06-01']
    }
df = pd.DataFrame(data)

# 1. 按分组维度+ID做透视,把同组A、B的指标值对齐到同一行
# 如果同组存在多条A/B记录,把pivot换成pivot_table,指定对应聚合函数即可
pivot_res = df.pivot(
    index=['date', 'anoter_id'],
    columns='ID',
    values=['Result1', 'Result2']
)

# 2. 批量计算所有指标列的B/A比值,自动重命名列
ratio_res = pivot_res.xs('B', axis=1, level=1) / pivot_res.xs('A', axis=1, level=1)
ratio_res.columns = [f'{col}_B/{col}_A_perDate' for col in ratio_res.columns]
ratio_res = ratio_res.reset_index()

# 3. 批量判断所有比值是否都在±10%偏差范围(即比值在0.9~1.1区间)
ratio_cols = [col for col in ratio_res.columns if col.endswith('perDate')]
ratio_res['inside_10%_limit'] = ratio_res[ratio_cols].apply(
    lambda row: ((row >= 0.9) & (row <= 1.1)).all(),
    axis=1
)

# 4. 如果只需要保留符合偏差要求的分组,取消下面这行的注释即可
# final_res = ratio_res[ratio_res['inside_10%_limit']].reset_index(drop=True)

方案优势

  • 无冗余代码:后续不管新增多少个类似Result的指标列,都不需要修改计算逻辑,自动完成比值计算
  • 计算准确:基于分组索引对齐A、B值做运算,不会出现排序错位导致的结果错误
  • 扩展性强:后续要调整偏差阈值、新增其他判断规则,只需要修改对应判断逻辑即可,不需要重构整体代码

运行后得到的结果结构和期望输出完全一致,可根据业务需要调整筛选条件。

内容的提问来源于stack exchange,提问作者Catarina Nogueira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:21:34