50044


素人質問で申し訳ないです。  
pandasデータフレームで条件に当てはまる数値を任意の数値（または文字）に書き換えたい場合どのようにすればよいのでしょうか。

[code]

    df = pd.DataFrame({'A': [0, 0, 2, 1], 'B': [1,2,3,4], 'C' : [5,7,2,5]},index = ["AA","BB","CC","DD"])
    print (df)
    
[/code]

このようなデータフレームから

[code]

    print (max(df.loc['AA','A':'C']))
    
[/code]

このように指定の”行”（このばあいはAA）ごとに最大値を見つけて、その最大値を任意の文字に書き換えたいのです。（本当のデータフレームには他の列もあるためこのように列の範囲指定しています）

[code]

    max(df.loc['AA','A':'C']) = 100
    
[/code]

としてもSyntaxError: can't assign to function call  
となってしまいできません。

該当値の位置情報がわかれば書き換えれると思うのですが、idxmaxなどを試してもうまくいきません。

この質問のすらうまく書けていないように思いますが、お助けいただけると幸いです。


CC BY-SA 4.0
2018-11-06T14:29:15.450
50019
2018-11-07T12:16:33.640
30869
question
python pandas
python pandasデータフレームで条件から得た値を書き換えるには？その位置情報が分かればできるのだろうが、それがわからない。


最大値が複数ある場合を考慮して、次のコードでどうでしょうか。

[code]

    df1 = df.loc[:,'A':'C']
    # 行ごとの最大値を求める
    s = df1.max(axis=1)
    # 行毎の最大値の位置を見つける(最大値を引けば0)
    m = df1.sub(s, axis=0) == 0
    # 書き換え
    df[m] = 100
    
[/code]


CC BY-SA 4.0
2018-11-07T01:12:27.207
50033
2018-11-07T03:00:03.297
2018-11-07T03:00:03.297
15171
15171
50019
answer


各行の最大値を100に置き換えるということでしょうかね。  
とりあえず思いつく方法を何点か

[code]

    # DataFrame.eq() と df.mask() を使う方法
    res = df.mask(df.eq(df.max(axis=1),axis=0), 100)
    print(res)
    #    A    B    C
    #AA  0    1  100
    #BB  0    2  100
    #CC  2  100    2
    #DD  1    4  100
    
[/code]

* * *
[code]

    # 行毎に関数を適用する方法
    res = df.apply(lambda r: r.mask(r==r.max(),100), axis=1)
    print(res)
        A    B    C
    #AA  0    1  100
    #BB  0    2  100
    #CC  2  100    2
    #DD  1    4  100
    
[/code]

* * *
[code]

    # 単純に行毎にループを回して、もとのDataFrameを書き換える方法
    for idx, row in df.iterrows():
        df.loc[idx, row==row.max()] = 100
    print(df)
    #    A    B    C
    #AA  0    1  100
    #BB  0    2  100
    #CC  2  100    2
    #DD  1    4  100
    
[/code]

* * *

**【追記】**  
最大値を求めるColumnを 'A','B','C' に限定する場合

[code]

    # DataFrame.eq() と df.mask() を使う方法
    res = df.mask(df.eq(df[['A','B','C']].max(axis=1),axis=0), 100)
    
[/code]

* * *
[code]

    # 行毎に関数を適用する方法
    res = df.apply(lambda r: r.mask(r==r[['A','B','C']].max(),100), axis=1)
    
[/code]

* * *
[code]

    # 単純に行毎にループを回して、もとのDataFrameを書き換える方法
    for idx, row in df.iterrows():
        df.loc[idx, row==row[['A','B','C']].max()] = 100
    
[/code]


CC BY-SA 4.0
2018-11-07T04:39:08.597
50044
2018-11-07T12:16:33.640
2018-11-07T12:16:33.640
24801
24801
50019
answer