2016-02-22 77 views
1

我有一個熊貓據幀,輸出類似如下:蟒蛇大熊貓 - 如何應用規範化函數將數據幀列

index value 
0 5.95 
1 1.49 
2 2.34 
3 5.79 
4 8.48 

我想每一列[「值」]的標準化值和將它存儲在一個新的列['normalized'],但不知道如何將正常化函數應用於列...

我的標準化函數看起來像這樣: (['value'] - min ['value '])/(max ['value'] - min ['value']

我知道我應該使用應用或轉換函數添加新的列到數據幀,但不知道如何將標準化函數傳遞到應用函數...

對不起,如果我得到的術語錯了,但我是一個newbe python和特別是熊貓!

回答

3

這些都是非常標準列操作:

>>> (df.value - df.value.min())/(df.value.max() - df.value.min()) 
0 0.638054 
1 0.000000 
2 0.121602 
3 0.615165 
4 1.000000 
Name: value, dtype: float64 

你可以簡單地寫

df['normalized'] = (df.value - .... 
2

讓我們調用你的DataFrame DF。

DF['normalised'] = (DF['value']-min(DF['value']))/(max(DF['value']-min(DF['value']) 

有竅門。

+0

這不會工作你傳遞給'min'和'max'的類型是熊貓'系列',這會引發一個'ValueError',因爲類型是數組類型的,所以不會理解這種類型 – EdChum

1

我會考慮用戶的λ/應用方法,我敢肯定,你就可以要求精確,這要求提前確定最小值和最大值。首先,編寫一個函數,該函數根據某些「全局」參數以及從數據行獲取的輸入值輸出一個值。

def norm(vmax, vmin, val): 
    return (val-vmin)/(vmax-vmin) 

接下來,從數據幀收集您的全局值:

val_min = df['value'].min() 
val_max = df['value'].max() 

最後,你可以申請功能,創建一個新的領域,以保存結果:

df['new_field'] = df.apply(lambda row : norm(val_min,val_max,row['value']),axis=1) 

df 
    value new_field 
0 5.95 0.361946 
1 1.49 1.000000 
2 2.34 0.878398 
3 5.79 0.384835 
4 8.48 -0.000000 

美使用這種'lambda'方法,你可以隨心所欲地調整你的函數,這在我看來無論如何都會更好地劃分代碼,允許重用 - 這總是一件好事。