[英]Pandas groupby with lambda and condition
我有以下 dataframe:
d = {'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
'value': [10, 8, 7, 7, 0, 2, 9, 4, 0, 9, 10, 4, 5, 5],
'box': [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2],
'fruit': ['apple', 'apple', 'apple', 'lime', 'lime', 'orange',
'orange', 'lime', 'orange', 'apple', 'apple', 'apple',
'orange', 'orange']
}
dummy_df = pd.DataFrame(d)
我想创建一个具有标准化值的列,条件是:我想按框列标准化值,但使用这些值来计算仅来自苹果项目的平均值和标准差。 因此,我不想使用每个框的平均值(box1_mean:6.14,box2_mean:5.28)和标准差(box1_std:3.71,box2_std:3.35),我只想使用“苹果”值来计算它(box1_apple_mean:8.33,box1_apple_std :1.52,box2_apple_mean:7.66,box2_apple_std:3.21)。
所需的 output 将如下所示:
我有这行代码来按框执行标准化,但这并没有给我所需的 output。
dummy_df['value_apple_stand'] = dummy_df.groupby('box')['value'].transform(lambda x: (x-x.mean())/x.std())
如何在仅根据水果为苹果的值计算均值和标准差时考虑额外信息?
先感谢您!
使用apply
而不是transform
。 通过apply
,您可以访问所有列,您可以使用这些列来过滤和计算特定条件下的mean
和std
差:
def norm_by(g, fruit):
fruit_value = g['value'][g['fruit'] == fruit]
return (g.value - fruit_value.mean()) / fruit_value.std()
dummy_df['value_apple_stand'] = \
dummy_df.groupby('box', group_keys=False).apply(norm_by, 'apple')
dummy_df
ID value box fruit value_apple_stand
0 1 10 1 apple 1.091089
1 2 8 1 apple -0.218218
2 3 7 1 apple -0.872872
3 4 7 1 lime -0.872872
4 5 0 1 lime -5.455447
5 6 2 1 orange -4.146140
6 7 9 1 orange 0.436436
7 8 4 2 lime -1.140647
8 9 0 2 orange -2.384989
9 10 9 2 apple 0.414781
10 11 10 2 apple 0.725866
11 12 4 2 apple -1.140647
12 13 5 2 orange -0.829561
13 14 5 2 orange -0.829561
要获得value_apple_stand
的平均值,其中水果等于苹果,您可以这样做;
df.loc[df['fruit'] == 'apple', 'value_apple_stand'].mean()
否则,应用 lambda function 来计算每种水果的 mean():
df.groupby(['fruit']).apply(lambda x: x['value_apple_stand'].mean())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.