77990


pandas.DatFrameで作成したクロス図について、以下のように、  
a行、b行それぞれの比率を表すクロス図に再構築したいと思っています。

[![画像の説明をここに入力](https://i.stack.imgur.com/5qd2y.png)](https://i.stack.imgur.com/5qd2y.png)

作業を何ステップに分け（無理やり）できましたが、  
もっと、シンプルに記述する方法は、ないでしょうか。  
よろしく、お願いいたします。

[code]

    import pandas as pd
    lst=[[120,80,300],[280,120,400]]
    df1=pd.DataFrame(lst,index=['a','b'],columns=['A','B','合計'])
    df1
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/AAUb4.png)](https://i.stack.imgur.com/AAUb4.png)

[code]

    #A列、B列を抽出する
    df2=df1.loc[:,['A','B']]
    df2
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/KEPlr.png)](https://i.stack.imgur.com/KEPlr.png)

[code]

    #それぞれを比率にする
    df3= ((df.div(df.sum(1),axis=0)))
    df3
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/ZPYjP.png)](https://i.stack.imgur.com/ZPYjP.png)

[code]

    # 「合計」列を追加する
    df4=df3.assign(合計=1.0)
    df4
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/MVdjZ.png)](https://i.stack.imgur.com/MVdjZ.png)


CC BY-SA 4.0
2021-07-05T06:49:51.103
77986
2021-07-05T07:55:17.523
47148
question
python3 pandas
pd.DataFrameを、比率を示す図に再構築したい


各行に対してapplyすることでlambda式で列の比率を求めることができます。

[code]

    import pandas as pd
    
    lst = [[120,80,200],[280,120,400]]
    df1 = pd.DataFrame(lst, index=['a','b'], columns=['A','B','合計'])
    df2 = df1.apply(lambda x : [x[c] / x['合計'] for c in df1], axis=1)
    print(df2)
    
    #出力結果
    a    [0.6, 0.4, 1.0]
    b    [0.7, 0.3, 1.0]
    dtype: object
    
[/code]


CC BY-SA 4.0
2021-07-05T07:41:39.263
77987
2021-07-05T07:41:39.263
9820
77986
answer


まず, 合計を算出するところから。  
割合は, 前の行との比較・割合なら pandasで用意されてるものがあるけど, このような場合は見つからなかったので普通に計算

[code]

    import pandas as pd
    lst=[[120,80], [280,120]]
    df = pd.DataFrame(lst, index=['a','b'], columns=['A','B'])
    
    df['合計'] = df.sum(axis=1)
    for item in ['A', 'B']:
        df[f'{item}(割合)'] = df[item] / df['合計']
    
    display(df)
    print()
    df[['A(割合)', 'B(割合)', '合計']]
    
[/code]

[![結果](https://i.stack.imgur.com/cs6Le.png)](https://i.stack.imgur.com/cs6Le.png)


CC BY-SA 4.0
2021-07-05T07:47:22.930
77989
2021-07-05T07:47:22.930
43025
77986
answer


以下は
[pandas.DataFrame.div](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.div.html#pandas-
dataframe-div) を使う方法です。

※ `120 + 80 = 200` なので `lst` を一部修正しています。

[code]

    lst = [[120,80,200],[280,120,400]]
    df1 = pd.DataFrame(lst,index=['a','b'],columns=['A','B','合計'])
    
    pd.set_option('display.unicode.east_asian_width', True)
    print(df1.div(df1['合計'], axis=0))
    
    #
         A    B  合計
    a  0.6  0.4   1.0
    b  0.7  0.3   1.0
    
[/code]


CC BY-SA 4.0
2021-07-05T07:48:42.330
77990
2021-07-05T07:55:17.523
2021-07-05T07:55:17.523
47127
47127
77986
answer