我的数据框大致如下:
category value
1 A 2
2 B 5
3 A 3
4 A 2
5 B 1
现在我想添加一个列,告诉我当前值是高于还是低于其类别中的 ,但我无法弄清楚如何。对于总平均值,我可以df["above_mean"] = (df["value"] > df["value"].mean())
,但如何将这些值与各自类别的平均值进行比较?
这就是我想要实现的目标:
category value above_mean
1 A 2 False
2 B 50 True
3 A 3 True
4 A 2 False
5 B 10 True
答案 0 :(得分:7)
我认为你需要:
print (df.groupby('category')['value'].mean())
category
A 2.333333
B 3.000000
Name: value, dtype: float64
df['above_mean'] = df.groupby('category')['value'].apply(lambda x: x > x.mean())
print (df)
category value above_mean
1 A 2 False
2 B 5 True
3 A 3 True
4 A 2 False
5 B 1 False
使用transform
的替代解决方案并与gt
(>
)进行比较:
print (df.groupby('category')['value'].transform('mean'))
1 2.333333
2 3.000000
3 2.333333
4 2.333333
5 3.000000
Name: value, dtype: float64
df['above_mean'] = df['value'].gt(df.groupby('category')['value'].transform('mean'))
#same as
#df['above_mean'] = df['value'] > df.groupby('category')['value'].transform('mean')
print (df)
category value above_mean
1 A 2 False
2 B 5 True
3 A 3 True
4 A 2 False
5 B 1 False