[英]Pandas dataframe scale column based on another column
我有一個看起來像這樣的數據框:
cat val
0 1 10
1 1 4
2 2 6
3 2 2
4 1 8
5 2 12
其中cat
是類別, val
是值。 我想創建一個名為scaled
的列,按類別線性縮放/標准化為 0-1。 我知道如何在列級別執行前者 - ((val - min) / (max - min))
- 我也知道如何在每個類別的基礎上執行操作,我只是不知道如何將兩者結合起來。 期望的結果是:
cat val scaled
0 1 10 1
1 1 4 0
2 2 6 0.4
3 2 2 0
4 1 8 0.667
5 2 12 1
理想情況下,我只想堅持使用 Pandas。
任何幫助將不勝感激,謝謝!
您的縮放是減去最小值並除以范圍,因此使用groupby
+ transform
將這些屬性廣播回該組的每一行並進行數學運算。
import numpy as np
gp = df.groupby('cat')['val']
df['scaled'] = (df['val'] - gp.transform(min))/gp.transform(np.ptp)
cat val scaled
0 1 10 1.000000
1 1 4 0.000000
2 2 6 0.400000
3 2 2 0.000000
4 1 8 0.666667
5 2 12 1.000000
對於減少為標量的聚合, groupby
+ agg/apply
減少為每組一行; 但是groupby
+ transform
返回一個類似索引的系列,以便它與原始 DataFrame 對齊。
gp.min()
#cat
#1 4
#2 2
#Name: val, dtype: int64
gp.transform(min)
#0 4
#1 4
#2 2
#3 2
#4 4
#5 2
#Name: val, dtype: int64
您可以使用以下代碼行基於另一列進行縮放
import pandas as pd
df = pd.DataFrame({'Group': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3], 'Values': [1, 4, -2, 7, 3, 4, 1, -5, 12, 4, 10, 2, 6, 20, 15]})
# Normalize around mean
df['mean_normal'] = df.groupby('Group').transform(lambda x: (x - x.mean()/ x.std()))
# Normalize between 0 and 1
df['min_max_normal'] = df.groupby('Group').transform(lambda x: ((x - x.min())/ (x.max() - x.min())))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.