基于对照组的多组实验样本pandas归一化实现方法咨询
问题解答
一、全局对照组平均值z的一行精简实现
1. 原生pandas最优写法
直接通过链式索引和聚合即可实现一行计算,性能和可读性都最好:
z = df.loc[df['identifier'] == 'Control', 'values'].mean()
2. 列表推导式实现
可以用列表推导式实现,但完全不推荐:pandas向量化操作的执行效率远高于列表遍历,语法也更简洁。非必要场景下不要用这种写法:
import numpy as np z = np.mean([val for ident, val in zip(df['identifier'], df['values']) if ident == 'Control'])
二、样本归一化最简实现
直接使用pandas分组聚合+映射即可完成,全程向量化操作,逻辑清晰且执行效率高:
# 计算每个实验对应的对照组平均值 exp_control_avg = df[df['identifier'] == 'Control'].groupby('Experiment')['values'].mean() # 计算各实验对应的归一化因子 = 全局对照均值z / 对应实验对照均值 exp_norm_factor = z / exp_control_avg # 给所有样本的values乘以对应实验的归一化因子,得到校正后的值 df.loc[df['identifier'] == 'Sample', 'corrected_values'] = df.loc[df['identifier'] == 'Sample', 'values'] * df.loc[df['identifier'] == 'Sample', 'Experiment'].map(exp_norm_factor)
如果需要把校正值直接覆盖原values列,把上述代码中的corrected_values改成values即可。
内容的提问来源于stack exchange,提问作者Ardalan1
相关产品推荐
相关产品推荐

