首页 > 解决方案 > 如何按列分组并进行标准化?

问题描述

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

    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”列进行规范化。我想做一个简单的 min-max norm 像 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

标签: python-3.xpandasaggregatepandas-groupby

解决方案


用于与原始尺寸相同GroupBy.transform的退货:Seriesdf

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())

推荐阅读