我有一个如下所示的 Pandas DataFrame:
data = {'user_id':[1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3],
'time':[10, 12, 11, 20, 40, 41, 42, 100, 60, 22, 0, 3],
'height':[1.23, 1.1, 0.5, 10.3, 3.33, 4.55, 2.22, 2.21, 2.25, 7.75, 9.2, 5.5],
'width':[3, 4, 6, 2, 4, 8, 9, 0, 6, 6, 6, 4]}
df = pd.DataFrame(data)
现在,我想从每一列(user_id 列除外)中减去按 user_id 分组的平均值。这意味着对于 user_id 1,time 的平均值是 13.25 ((10 + 12 + 11 + 20)/4),因此从 10、12、11 中减去 13.25和 20 导致
'time':[-3.25, -1.25, -2.25, 6.75, 40, 41, 42, 100, 60, 22, 0, 3]
我想对所有列和所有用户执行此操作。如何做到这一点?
请您参考如下方法:
您可以使用 groupby.transform 创建一个与数据框形状相同的数组。然后从您的 time 列中减去它:
m = df.groupby('user_id')['time'].transform('mean')
df['time'].add(-m)
0 -3.25
1 -1.25
2 -2.25
3 6.75
4 -1.00
5 0.00
6 1.00
7 63.00
8 23.00
9 -15.00
10 -37.00
11 -34.00
Name: time, dtype: float64
m 的输出结果为:
print(m)
0 13.25
1 13.25
2 13.25
3 13.25
4 41.00
5 41.00
6 41.00
7 37.00
8 37.00
9 37.00
10 37.00
11 37.00
Name: time, dtype: float64
