如何按列分组并进行规范化?

时间:2019-01-18 15:45:16

标签: python-3.x pandas aggregate pandas-groupby

假设我有一个这样的日期框架:

    A      B      C       
0  foo    one     1
1  bar    one     2
2  foo    two     1
3  bar  three     2
4  foo    two     3
5  bar    two     5
6  foo    one     2
7  foo  three     5
8  bar    one     4

我想按“ B”分组,并对每个“ B”的“ C”列进行归一化。 我想做一个简单的最小-最大范数,如x / max(x)

grouped_b = df.groupby('B')

def norm(value):
    return value/value.max()

norm_B = grouped_b['C'].agg(norm)

结果如下:

    A      B      C       
0  foo    one    0.25
1  bar    one    0.5
2  foo    two    0.2
3  bar  three    0.25
4  foo    two    0.6
5  bar    two     1
6  foo    one    0.5
7  foo  three     1
8  bar    one     1

2 个答案:

答案 0 :(得分:1)

使用GroupBy.transform返回Series,其大小与原始df相同:

grouped_b = df.groupby('B')

def norm(value):
    return value/value.max()

df['C'] = grouped_b['C'].transform(norm)

print (df)
     A      B     C
0  foo    one  0.25
1  bar    one  0.50
2  foo    two  0.20
3  bar  three  0.40
4  foo    two  0.60
5  bar    two  1.00
6  foo    one  0.50
7  foo  three  1.00
8  bar    one  1.00

您还可以使用lambda函数:

df['C'] = df.groupby('B')['C'].transform(lambda x: x / x.max())

答案 1 :(得分:1)

使用transform

df.C/=df.groupby(['B']).C.transform('max')