#Pandas 欠損値の最頻値による置換
欠損値(nan)を中央値、平均値、最頻値などで置き換えますが、最頻値での置換にちょっと躓いたので、メモを残したいと思います。
まずはデータフレームを以下のように定義
df = pd.DataFrame(["東","西","南","北","北",np.nan], columns=["方位"])
方位 | |
---|---|
0 | 東 |
1 | 西 |
2 | 南 |
3 | 北 |
4 | 北 |
5 | NaN |
mode()を使って確かめてみると、最頻値は"北"です。
df["方位"].mode()
方位 | |
---|---|
0 | 北 |
中央値、平均値と同じ要領でfillna()を使うと
df.fillna(df["方位"].mode())
エラーにはなりませんが、更新できていません。
方位 | |
---|---|
0 | 東 |
1 | 西 |
2 | 南 |
3 | 北 |
4 | 北 |
5 | NaN |
原因はこれです。
type(df["方位"].mode())
pandas.core.series.Series
最頻値の場合、平均値や中央値と違って、複数の値を返す可能性があるため、戻り値は
- DataFrame渡しの場合は、DataFrame
- Series渡しの場合は、Series
が返ってきます。
df.fillna(df["方位"].mode()[0])
そのため、明示的にインデックス番号を指定してあげなければなりませんでした。
これで無時に更新できました。
方位 | |
---|---|
0 | 東 |
1 | 西 |
2 | 南 |
3 | 北 |
4 | 北 |
5 | 北 |