2016-02-28 35 views
6

我有一個包含光譜數據和元數據的熊貓數據框。這些列用多索引進行標記,以便df['wvl']給出譜圖並且df['meta']給出元數據。在df['wvl']內,列標籤是光譜儀通道的波長值。規範化熊貓數據框的行數其總和

我想要做的就是將該行的總和標準化爲df['wvl']的每一行,以便將行中的值相加得出總數爲1.0。

下面是數據幀的一行是這樣的:

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 

但是,當我做這樣的事情:

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

什麼也沒有發生!我得到確切的相同的價值觀:

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 

如果我創建一個臨時變量來保存該行,我可以做歸一化就好了:

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 

但是,如果我嘗試更換數據框行歸一化的臨時變量,沒有任何反應:

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 

我明明在這裏的東西,但我想不出什麼,它的駕駛我瘋狂。幫幫我?提前致謝!

+0

[規範化由行一個大熊貓數據幀(https://stackoverflow.com/questions/18594469/normalizing-a-pandas-dataframe-by-row)的可能的複製 –

回答

10

您可以使用

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

df.sum(axis=1)總結了每一行; df.div(..., axis=0)然後分開。

實施例:

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

哇,就像一個魅力一樣工作!謝謝!你能幫我理解爲什麼我在做什麼不工作? – rba

+0

@ eft773所以我琢磨了一下,似乎'iloc'正在返回一個副本,因此,賦值並不會改變任何內容。這是否解決您的問題? –

+0

啊,我明白了。我認爲這是有道理的。因此,本質上'df ['wvl']。iloc [0]'實際上不再是df ['wvl']的一部分,因此編輯它對原始文件沒有任何影響。謝謝! – rba