Pandas 在 groupby 上按列归一化
Pandas normalise by column on groupby
给定一个 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: ...)
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
可能不是最好的方法,但如果你的数据框不是很大,那么这会做:
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())
It proves unclear how to update each normalised column after 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())))
给定一个 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: ...)
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
可能不是最好的方法,但如果你的数据框不是很大,那么这会做:
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())
It proves unclear how to update each normalised column after
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())))