通过它们的总和来规范化大熊猫数据帧

rba*_*rba 21 python pandas

我有一个包含光谱数据和元数据的熊猫数据帧.列用多索引标记,以便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
Run Code Online (Sandbox Code Playgroud)

但当我做类似的事情时:

df['wvl'].iloc[0]=df['wvl'].iloc[0]/df['wvl'].iloc[0].sum()
Run Code Online (Sandbox Code Playgroud)

什么都没发生!我得到完全相同的值:

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
Run Code Online (Sandbox Code Playgroud)

如果我创建一个临时变量来保存行,我可以很好地进行规范化:

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
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试用规范化的临时变量替换数据帧行,则没有任何反应:

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
Run Code Online (Sandbox Code Playgroud)

我显然在这里遗漏了一些东西,但我无法弄清楚是什么,它让我疯狂.救命?提前致谢!

Ami*_*ory 58

您可以使用

df.div(df.sum(axis=1), axis=0)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • @ eft773所以我修了一下,似乎`iloc`正在返回一个副本,因此,赋值给它并没有改变任何东西.这是否解决了您的问题? (2认同)
  • 有什么理由解释为什么“axis=1”是行总和而“axis=1”是**列**除法? (2认同)