1. ホーム
  2. python

[解決済み] pandasデータフレームの行をその合計で正規化する [重複] 。

2022-02-09 09:38:20

質問

スペクトルデータとメタデータを含むpandas dataframeを持っています。列はマルチインデックスでラベル付けされ、以下のようになります。 df['wvl'] はスペクトルを、そして df['meta'] はメタデータを提供します。その中で df['wvl'] 列のラベルは分光器チャンネルの波長値である。

の各行を正規化したいのです。 df['wvl'] を、その行の値を足すと合計が1.0になるようにします。

データフレームの1行はこんな感じです。

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

明らかに何かを見逃しているのですが、それがわからず、気が狂いそうです。助けてください。ありがとうございます。

解決方法は?

を使用することができます。

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