用pandas数据帧行的和对其进行规范化

2024-04-23 14:40:38 发布

您现在位置: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

但当我做一些类似的事情时:

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

但如果我尝试用规范化的临时变量替换dataframe行,则不会发生任何事情:

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

很明显我在这里漏掉了一些东西,但我不知道是什么让我发疯。帮忙?提前谢谢!


Tags: 数据name标记pandasdf光谱规范化事情
1条回答
网友
1楼 · 发布于 2024-04-23 14:40:38

你可以用

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

相关问题 更多 >