Pandas:基于组内对照值实现组内结果缩放
问题描述
现有如下包含分组、处理方式及测量结果的DataFrame:
import pandas as pd X = pd.DataFrame({ 'group':['A','A','A','B','B','B'], 'treatment':['control', 'high_dose', 'low_dose', 'control', 'high_dose', 'low_dose'], 'result':[2, 6, 4, 3, 12, 15] })
对应的表格形式:
| group | treatment | result |
|---|---|---|
| A | control | 2 |
| A | high_dose | 6 |
| A | low_dose | 4 |
| B | control | 3 |
| B | high_dose | 12 |
| B | low_dose | 15 |
需要实现:用每个分组内control处理对应的result值,对同组所有结果进行缩放,生成新列result_group_stand,最终得到如下结果:
group treatment result result_group_stand 0 A control 2 1 1 A high_dose 6 3 2 A low_dose 4 2 3 B control 3 1 4 B high_dose 12 4 5 B low_dose 15 5
即A组所有结果除以control值2,B组所有结果除以control值3。
解决方法
方法1:使用groupby + transform提取组内control值
通过分组后提取对应control的结果,再广播到整组完成计算:
# 提取每个group对应的control结果,生成映射系列 control_vals = X[X['treatment'] == 'control'].set_index('group')['result'] # 按group分组,用transform获取每组的control值,计算缩放结果 X['result_group_stand'] = X['result'] / X.groupby('group')['result'].transform( lambda x: control_vals[x.name] )
方法2:提取control值后合并到原DataFrame
先单独提取各分组的control值,通过合并关联到原数据后计算缩放:
# 提取control组数据并重命名列 control_df = X[X['treatment'] == 'control'][['group', 'result']].rename(columns={'result': 'control_result'}) # 合并原数据与control值 X_merged = pd.merge(X, control_df, on='group', how='left') # 计算缩放列 X_merged['result_group_stand'] = X_merged['result'] / X_merged['control_result'] # 可选:删除中间列 X = X_merged.drop('control_result', axis=1)
方法3:使用map匹配组内control值
构建分组到control值的字典,通过map匹配后直接计算:
# 构建group到control result的字典 control_dict = X[X['treatment'] == 'control'].set_index('group')['result'].to_dict() # 匹配对应control值并计算缩放 X['result_group_stand'] = X['result'] / X['group'].map(control_dict)
三种方法均可实现需求,其中方法3代码最简洁,方法2逻辑最直观,可根据实际场景选择。
内容的提问来源于stack exchange,提问作者freesoup
相关产品推荐
相关产品推荐

