基于分组的 Pandas 列归一化

6

假设有一个像下面这样的 pandas 数据框:

import pandas as pd

df = pd.DataFrame({'id': ['id1','id1','id2','id2'] , 
                   'x':  [1,2,3,4], 
                   'y':  [10,20,30,40]})

每个数值列可以通过以下方法被规范化到单位间隔[0,1]

columns = ['x', 'y']

for column in columns:
    df[column] = (df[column] - df[column].min()) / (df[column].max() - df[column].min())

导致
    id         x         y
0  id1  0.000000  0.000000
1  id1  0.333333  0.333333
2  id2  0.666667  0.666667
3  id2  1.000000  1.000000

然而,如何对每个id的每个数字列应用此归一化?预期结果将在这个过度简化的示例中。
    id         x         y
0  id1  0.000000  0.000000
1  id1  1.000000  1.000000
2  id2  0.000000  0.000000
3  id2  1.000000  1.000000

更新每个归一化的列后如何操作尚不清楚。
df.groupby(['id']).apply(lambda x: ...)
3个回答

4
使用 GroupBy.transform
columns = ['x', 'y']
g = df.groupby('id')[columns]
df[columns] = (df[columns] - g.transform('min')) / (g.transform('max') - g.transform('min'))
    
print (df)
    id    x    y
0  id1  0.0  0.0
1  id1  1.0  1.0
2  id2  0.0  0.0
3  id2  1.0  1.0

1
在使用 df.groupby(['id']).apply(lambda x:...) 后如何更新每个标准化的列并不清楚。您可以再次使用 apply
df.groupby(["id"])\
.apply(lambda id_df: id_df[columns]\
                     .apply(lambda serie: (serie - serie.min()) / (serie.max() - serie.min())))

0

也许不是最好的方法,但如果您的数据框不是很大,那么这样做就可以了:

for column in columns:
    for id in list_of_IDs:
        df.loc[df.loc[id] == i,column] = (df.loc[df.loc[id] == i,column] - df.loc[df.loc[id] == i,column].min()) / df.loc[df.loc[id] == i,column].max() - df.loc[df.loc[id] == i,column].min())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接