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
相关产品推荐
相关产品推荐

