Python 通过数据帧行的和来规范化数据帧行
我有一个包含光谱数据和元数据的熊猫数据框架。列用多索引标记,以便Python 通过数据帧行的和来规范化数据帧行,python,pandas,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 ...
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
我显然错过了一些东西,但我不知道是什么,这让我发疯。帮忙?提前谢谢 您可以使用
df.div(df.sum(axis=1), axis=0)
df.sum(轴=1)
对每行求和df.div(…,轴=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
哇,真是妙极了!谢谢你能帮我理解为什么我所做的不起作用吗?@eft773所以我做了一些修改,看起来
iloc
正在返回一个副本,因此,分配给它不会改变任何东西。这能回答你的问题吗?啊,我明白了。我认为这是有道理的。因此,实际上,df['wvl'].iloc[0]
不再是df['wvl']的一部分,因此编辑它对原始文件没有任何影响。非常感谢。为什么axis=1
是行和,而axis=1
是列除法?