假设我有一个包含person_id
和mean_act
列的DataFrame,其中每一行都是特定人员的数值。我想计算个人级别所有值的zscore。也就是说,我想要一个新的列mean_act_person_zscore
,它仅使用该人的zscores的均值和标准(而不是整个数据集)计算为mean_act
的zscore。
我的第一种方法是这样的:
person_ids = df['person_id'].unique()
for pid in person_ids:
person_df = df[df['person_id'] == pid]
person_df = (person_df['mean_act'] - person_df['mean_act'].mean())/person_df['mean_act'].std()
在每次迭代时,它都会计算正确的zscore输出序列,但问题在于,由于选择是通过引用而不是值,原始df
最终没有mean_act_person_zscore
列。
关于如何做到这一点的想法?
答案 0 :(得分:1)
应该是直截了当的:
df['mean_act_person_zscore'] = df.groupby('person_id').mean_act.transform(lambda x: (x - x.mean()) / x.std())