繁体   English   中英

Pandas groupby 与 lambda 和条件

[英]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 ,您可以访问所有列,您可以使用这些列来过滤和计算特定条件下的meanstd差:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM