【问题标题】:Normalize rows of pandas data frame by their sums [duplicate]通过它们的总和规范化熊猫数据框的行[重复]
【发布时间】:2016-06-11 06:31:05
【问题描述】:

我有一个包含光谱数据和元数据的 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

但如果我尝试用规范化的临时变量替换数据框行,则什么也不会发生:

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

我显然在这里遗漏了一些东西,但我不知道是什么,这让我发疯了。帮助?提前致谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用

    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
    

    【讨论】:

    • 哇,这就像一个魅力!谢谢!你能帮我理解为什么我在做的事情不起作用吗?
    • @eft773 所以我修改了一下,似乎iloc 正在返回一个副本,因此,分配给它不会改变任何东西。这是否解决了您的问题?
    • 啊,我明白了。我认为这是有道理的。所以,基本上df['wvl'].iloc[0] 实际上不再是 df['wvl'] 的一部分,所以编辑它对原始文件没有任何影响。谢谢!
    • 有什么理由为什么axis=1 是行总和而axis=1除法?
    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 2017-05-04
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多