2016-02-28 19 views
6

Mam pandasową ramkę danych zawierającą dane spektralne i metadane. Kolumny są oznaczone jako wiele indeksu, więc df['wvl'] daje widma, a df['meta'] podaje metadane. W ramach df['wvl'] etykiety kolumn są wartościami długości fal dla kanałów spektrometru.Normalizuj wiersze ramki danych pandy według ich wartości

Co chcę zrobić, to znormalizować każdy wiersz df['wvl'] przez sumę tego rzędu, tak aby zsumowanie wartości w wierszu daje łącznie 1,0.

Oto co jeden wiersz dataframe wygląda następująco:

df['wvl'].iloc[0] 
246.050003  128.533035 
246.102005  102.756321 
246.156006  99.930775 
...  
848.697205  121.313347 
848.896423  127.011662 
849.095703  123.234168 
Name: 0, dtype: float64 

Ale kiedy zrobić coś takiego:

df['wvl'].iloc[0]=df['wvl'].iloc[0]/df['wvl'].iloc[0].sum() 

Nic się nie dzieje! Mam dokładnie te same wartości:

df['wvl'].iloc[0] 
246.050003  128.533035 
246.102005  102.756321 
246.156006  99.930775 
...  
848.697205  121.313347 
848.896423  127.011662 
849.095703  123.234168 
Name: 0, dtype: float64 

Jeśli utworzyć zmienną tymczasową trzymać wiersz, mogę zrobić normalizację dobrze:

temp=df['wvl'].iloc[0] 

temp=temp/temp.sum() 

temp 
246.050003 0.000027 
246.102005 0.000022 
246.156006 0.000021 
       ... 
848.697205 0.000026 
848.896423 0.000027 
849.095703 0.000026 
Name: 0, dtype: float64 

Ale gdy próbuję zastąpić wiersz dataframe z zmienna tymczasowa znormalizowane, nic się nie dzieje:

df['wvl'].iloc[0]=temp 

df['wvl'].iloc[0] 
246.050003  128.533035 
246.102005  102.756321 
246.156006  99.930775 
       ...  
848.697205  121.313347 
848.896423  127.011662 
849.095703  123.234168 
Name: 0, dtype: float64 

ja oczywiście brakuje czegoś tutaj, ale nie mogę dowiedzieć się, co i to doprowadza mnie do szaleństwa. Wsparcie? Z góry dziękuję!

+0

Możliwe duplikat [Normalizowanie jak DataFrame pandas po wierszu] (https://stackoverflow.com/questions/18594469/normalizing-a-pandas-dataframe-by-row) –

Odpowiedz

10

Można użyć

df.div(df.sum(axis=1), axis=0) 

df.sum(axis=1) podsumowuje każdego wiersza; df.div(..., axis=0), a następnie dzieli.

przykład:

import pandas as pd 

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]}) 
>>> df.div(df.sum(axis=1), axis=0) 
    a b 
0 0.250000 0.750000 
1 0.333333 0.666667 
+0

wow , który działał jak czar! Dzięki! Czy możesz mi pomóc zrozumieć, dlaczego to, co robię, nie działa? – rba

+0

@ eft773 Więc trochę pomieszałem i wygląda na to, że 'iloc' zwraca kopię, więc przypisanie do niej niczego nie zmienia. Czy to odpowiada na twoje pytanie? –

+0

Ahh, rozumiem. Myślę, że ma to sens. Zatem, w zasadzie 'df ['wvl']. Iloc [0]' nie jest już częścią df ['wvl'], więc edycja nie ma nic wspólnego z oryginałem. Dziękuję Ci! – rba

Powiązane problemy