我正在遵循这个例子,我想使用熊猫重播。不幸的是,我几乎立即陷入困境:我不知道如何为所有行添加一列,其中包含每个类别的平均值。
我的数据框:
ages = pd.DataFrame(
[[13, 0.0, 1.0, 1.0],
[14, 0.0, 1.0, 0.0],
[15, 0.0, 1.0, 0.0],
[25, 1.0, 1.0, 1.0],
[35, 0.0, 1.0, 1.0],
[49, 1.0, 0.0, 0.0],
[68, 1.0, 1.0, 1.0],
[71, 1.0, 0.0, 0.0],
[73, 1.0, 0.0, 1.0]], columns=['age', 'gardening', 'gameing', 'hats'])
我想为所有(不(做园艺的人添加一个平均年龄列:
ages['ma'] = ages.groupby('gardening')['age'].mean()
但这给出了:
19.5
57.2
6 x NaN
我想要(第一列(
gardening age
19.5 0 13
19.5 0 14
19.5 0 15
57.2 1 25
19.5 0 35
57.2 1 49
57.2 1 68
57.2 1 71
57.2 1 73
^^
我尝试了广播,转换,但这并没有给出我想要的结果。我该如何解决这个问题?
将groupby
与transform
一起使用:
ages['avg_garden_age'] = ages.groupby('gardening')['age'].transform('mean')
ages
输出:
age gardening gameing hats avg_garden_age
0 13 0.0 1.0 1.0 19.25
1 14 0.0 1.0 0.0 19.25
2 15 0.0 1.0 0.0 19.25
3 25 1.0 1.0 1.0 57.20
4 35 0.0 1.0 1.0 19.25
5 49 1.0 0.0 0.0 57.20
6 68 1.0 1.0 1.0 57.20
7 71 1.0 0.0 0.0 57.20
8 73 1.0 0.0 1.0 57.20
使用np.bincount
和gardening
列已经0
和1
的事实
def grp_mean(bins, weights):
counts = np.bincount(bins)
sums = np.bincount(bins, weights)
return (sums / counts)[bins]
ages.assign(avg_garden_age=grp_mean(ages.gardening.values.astype(int), ages.age))
age gardening gameing hats avg_garden_age
0 13 0.0 1.0 1.0 19.25
1 14 0.0 1.0 0.0 19.25
2 15 0.0 1.0 0.0 19.25
3 25 1.0 1.0 1.0 57.20
4 35 0.0 1.0 1.0 19.25
5 49 1.0 0.0 0.0 57.20
6 68 1.0 1.0 1.0 57.20
7 71 1.0 0.0 0.0 57.20
8 73 1.0 0.0 1.0 57.20