89213


## 概要

PandasのDataframeにあるデータを、列のラベルごとに集計し、特定の分位数を使って外れ値の除外をするにはどのようなコードを書けばよいでしょうか?

## 詳細

環境はpython3.6です  
対象となるDataframeは以下のような内容です

[code]

    sensor_name temperature Humidity Pressure
    sensor1 15.5 67 1001
    sensor1 15.8 68 1009
    sensor2 13.3 57 1009
    sensor2 13.2 55 1008
    ...
    
[/code]

このようなDataframe(dataと命名)に対して、以下のコードである定数の分位数を求めました

[code]

    data_q = data.grpupby("sensor_name").quantile(0.9)
    
[/code]

こうすることで以下のようなDataframe(data_qと命名)を得られました

[code]

    sensor_name temperature Humidity Pressure
    sensor1 18.8 75 1014
    sensor2 14.5 66 1015
    sensor3 15.5 87 1002
    ...
    
[/code]

この二つのDataframeを使って、dataに含まれている分位数(サンプルコードでは90%)より大きな値はNaNとするコードはどのようなコードになりますでしょうか?  
理想の結果は以下のような内容となります

[code]

    sensor_name temperature Humidity Pressure
    sensor1 99.9 70 1004
    ↓
    sensor1の気温データがdata_qにあるsensor1の気温データを超過するためNaNを代入
    sensor_name temperature Humidity Pressure
    sensor1 NaN 70 1004
    
[/code]


CC BY-SA 4.0
2022-06-03T05:04:02.213
89208
2022-06-03T12:09:37.537
2022-06-03T05:22:13.230
19500
19500
question
python python3 pandas
PandasのDataframeにあるデータを対象に分位数を使った足切りをしたい


こちらの記事のように[pandas.DataFrame.where](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.where.html)あるいは[pandas.DataFrame.mask](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.mask.html)を使用すれば良いでしょう。  
[pandasで条件に応じて値を代入（where, mask）](https://note.nkmk.me/python-pandas-where-
mask/)

以下のようにしてnumpyもimportしておきます。

[code]

    import numpy as np
    
[/code]

whereを使う場合はこちらになります。

[code]

    data_q['temperature'].where(data_q['temperature'] <= 90.0, np.nan, inplace=True)
    
[/code]

maskを使う場合はこちらになります。

[code]

    data_q['temperature'].mask(data_q['temperature'] > 90.0, np.nan, inplace=True)
    
[/code]

python 3.10で確認したのでpython 3.6では変わるかもしれませんが、試してみてください。


CC BY-SA 4.0
2022-06-03T12:09:37.537
89213
2022-06-03T12:09:37.537
26370
89208
answer