簡體   English   中英

基於另一列的 Pandas 數據框比例列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM