2015-08-21 11 views
6

Mam problem ze znalezieniem tej wersji, która nie jest w pętli. Powiedz, że to jest moje wejście:Jak normalizować przez inny wiersz w pandach 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] 

Eksperyment 0 to moja kontrola. Przeprowadziłem ten eksperyment dla różnych kolorów. Chcę normalizować wszystkie wiersze w eksperymencie dopasowywania kolorów 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] 

Wydaje chciałbym dokładne eksperymentu zerowe parametry do własnej kolumny, aby umożliwić łatwy podział, ale nie mogę uzyskać układania/obrót/concat'ing do prawidłowego działania. Zrobiłem to z pętlami, używając .at i przypisywania wartości, ale było to niesłuszne.

kolejnych kroków będzie normalizacji kilka kolumn i tworzenia upplower i dolne granice błędu obliczone z wartości (n,), (n, wartość2), (N), other_values ​​itp

+0

zajrzeć do 'sklearn' za' MinMaxScaler'; Zobrazowałbym, że zoptymalizowali operacje wektorowe. Również jesteś pewien, że możesz go zasilić 'pandas' danymi http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html – Ryan

+0

@Ryan, nie jest to do skalowania wartości w jednej kolumnie /szyk? Kiedy mówię "normalizuj", nie mam na myśli zakresów wektorowych (0,1), ale że każdy jest podzielony przez wartość zewnętrzną. – physicsmichael

Odpowiedz

4

Jednym ze sposobów jest użycie transform (tutaj używając idxmin, chociaż istnieje wiele alternatyw), aby uzyskać indeksy wierszy, które chcemy wykorzystać jako mianownik:

>>> 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 

krok po kroku, najpierw musimy znaleźć indeksy mianownika:

>>> 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 

Wtedy możemy użyć tego wskaźnika w ramce:

>>> 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 

Ponieważ jesteśmy obsługi wyrównanie sami, musimy wywołać .values spadać w dół do leżących array-- pand będzie inaczej staraj się przechytrzyć nas i poprawnie dopasować elementy na podstawie indeksów.

Następnie dzielimy:

>>> (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 

i wreszcie do nich dołączyć, zmiana nazwy nowe kolumny:

>>> 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 
Powiązane problemy