2015-08-21 41 views
6

我很難找到這個非for循環版本。說這是我的輸入:如何用pandas DataFrame中的另一行進行標準化?

In [94]: df 
Out[94]: 
     N experiment color value value2 
0 145000   0  red 0.30 0.363953 
1 14000   1  red 0.31 0.218978 
2 13000   2  red 0.29 0.948070 
3 15000   0 yellow 0.31 0.620201 
4 1200   1 yellow 0.32 0.567513 
5 1400   2 yellow 0.31 0.318197 
6 40000   0 green 0.29 0.947226 
7 3000   1 green 0.31 0.084243 
8 7000   2 green 0.32 0.961020 

[9 rows x 5 columns] 

實驗0是我的控制。我進行了各種顏色的這個實驗。我想匹配的顏色實驗0

In [104]: df 
Out[104]: 
     N experiment color value value2 scaled_value scaled_value2 
0 145000   0  red 0.30 0.363953  1.000000  1.000000 
1 14000   1  red 0.31 0.218978  1.033333  0.590786 
2 13000   2  red 0.29 0.948070  0.966667  2.604732 
3 15000   0 yellow 0.31 0.620201  1.000000  1.000000 
4 1200   1 yellow 0.32 0.567513  1.032258  0.914220 
5 1400   2 yellow 0.31 0.318197  1.000000  0.512737 
6 40000   0 green 0.29 0.947226  1.000000  1.000000 
7 3000   1 green 0.31 0.084243  1.068966  0.088680 
8 7000   2 green 0.32 0.961020  1.103448  1.014541 

[9 rows x 7 columns] 

看來我想零個參數精確的實驗,以自己的列允許容易分裂正常化的所有行,但我不能讓堆疊/旋轉/ concat'ing正常工作。我使用.at和賦值的for循環做了這個,但它感覺錯了。

接下來的步驟將被歸一化的多個列和創建upplower和從(N,值),(N,值2)來計算較低誤差界限,(N,other_values)等

+0

查找到'sklearn'的'MinMaxScaler';我想他們已經優化了矢量操作。也很確定你可以餵它'pandas'數據http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html – Ryan

+0

@Ryan,是不是在一個列中縮放值/數組?當我說歸一化時,我不是指矢量範圍(0,1),而是每個範圍除以外部值。 – physicsmichael

回答

4

的一種方法將是使用transform(這裏使用idxmin,雖然有很多的替代品)來得到我們想要作爲分母用行的索引:

>>> ii = df.groupby("color")["experiment"].transform("idxmin") 
>>> cols = ["value", "value2"] 
>>> new_cols = (df.loc[:,cols] /df.loc[ii, cols].values) 
>>> df.join(new_cols.rename(columns=lambda x: "scaled_" + x)) 
     N experiment color value value2 scaled_value scaled_value2 
0 145000   0  red 0.30 0.363953  1.000000  1.000000 
1 14000   1  red 0.31 0.218978  1.033333  0.601666 
2 13000   2  red 0.29 0.948070  0.966667  2.604924 
3 15000   0 yellow 0.31 0.620201  1.000000  1.000000 
4 1200   1 yellow 0.32 0.567513  1.032258  0.915047 
5 1400   2 yellow 0.31 0.318197  1.000000  0.513055 
6 40000   0 green 0.29 0.947226  1.000000  1.000000 
7 3000   1 green 0.31 0.084243  1.068966  0.088937 
8 7000   2 green 0.32 0.961020  1.103448  1.014563 

一步一步來,首先我們找到分母指數:

>>> ii = df.groupby("color")["experiment"].transform("idxmin") 
>>> ii 
0 0 
1 0 
2 0 
3 3 
4 3 
5 3 
6 6 
7 6 
8 6 
dtype: int64 

然後我們可以使用這個索引到框架:因爲我們正在處理的對準自己

>>> df.loc[ii, cols] 
    value value2 
0 0.30 0.363953 
0 0.30 0.363953 
0 0.30 0.363953 
3 0.31 0.620201 
3 0.31 0.620201 
3 0.31 0.620201 
6 0.29 0.947226 
6 0.29 0.947226 
6 0.29 0.947226 

,我們需要調用.values到下降到底層array--否則將大熊貓嘗試智取我們並根據指數正確對齊事物。

然後我們劃分:

>>> (df.loc[:,cols] /df.loc[ii, cols].values) 
     value value2 
0 1.000000 1.000000 
1 1.033333 0.601666 
2 0.966667 2.604924 
3 1.000000 1.000000 
4 1.032258 0.915047 
5 1.000000 0.513055 
6 1.000000 1.000000 
7 1.068966 0.088937 
8 1.103448 1.014563 

終於加入他們的行列,重命名新列:

>>> df.join(new_cols.rename(columns=lambda x: "scaled_" + x)) 
     N experiment color value value2 scaled_value scaled_value2 
0 145000   0  red 0.30 0.363953  1.000000  1.000000 
1 14000   1  red 0.31 0.218978  1.033333  0.601666 
2 13000   2  red 0.29 0.948070  0.966667  2.604924 
3 15000   0 yellow 0.31 0.620201  1.000000  1.000000 
4 1200   1 yellow 0.32 0.567513  1.032258  0.915047 
5 1400   2 yellow 0.31 0.318197  1.000000  0.513055 
6 40000   0 green 0.29 0.947226  1.000000  1.000000 
7 3000   1 green 0.31 0.084243  1.068966  0.088937 
8 7000   2 green 0.32 0.961020  1.103448  1.014563 
相關問題