Skip to main content
 首页 » 编程设计

python之减去按一列分组的列的平均值

2025年05月04日11Free-Thinker

我有一个如下所示的 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