2016-02-28 68 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