DataFrameの欠損値についての取り扱い方法 その4 前後のデータをコピーする
前回↓の続きです。
前回の終わりに次回予告のようになっていた以下について
- その列の平均値をいれる
- その列の1個上の値を入れる
- その列の1個下の値を入れる
をまとめていきたいと思います。
テストデータの準備
以下のようなテストデータを準備します。
Japanese | English | math | Science | social studies |
---|---|---|---|---|
100 | NaN | 90 | NaN | 90 |
NaN | 80 | 85 | NaN | 80 |
80 | 92 | 90 | 90 | 85 |
NaN | 90 | 88 | 100 | NaN |
90 | 88 | NaN | 90 | NaN |
実際やってみよう
import numpy as np import pandas as pd data = {"Japanese":[100,np.nan,80,np.nan,90],"English":[np.nan,80,92,90,88],"math":[90,85,90,88,np.nan],"Science":[np.nan,np.nan,90,100,90],"social studies":[90,80,85,np.nan,np.nan]} df = pd.DataFrame(data) print(df)
dfの結果:
Japanese | English | math | Science | social studies | |
---|---|---|---|---|---|
0 | 100 | NaN | 90 | NaN | 90 |
1 | NaN | 80 | 85 | NaN | 80 |
2 | 80 | 92 | 90 | 90 | 85 |
3 | NaN | 90 | 88 | 100 | NaN |
4 | 90 | 88 | NaN | 90 | NaN |
その列の平均値を欠損値にいれてみよう。
欠損値へのデータはfillna()を使ってデータを入れていきます。 平均値と、中央値も同時にまとめてみましょう。
#平均値 df2 = df.fillna(df.mean()) #中央値 df3 = df.fillna(df.median())
df2(平均値)の結果:
赤文字の部分が元NANだった場所です。
Japanese | English | math | Science | social studies | |
---|---|---|---|---|---|
0 | 100.0 | 87.5 | 90.0 | 93.33 | 90.0 |
1 | 90.0 | 80.0 | 85.0 | 93.33 | 80.0 |
2 | 80.0 | 92.0 | 90.0 | 90.0 | 85.0 |
3 | 90.0 | 90.0 | 88.0 | 100.0 | 85.0 |
4 | 90.0 | 88.0 | 88.25 | 90.0 | 85.0 |
df3(中央値)の結果:
Japanese | English | math | Science | social studies | |
---|---|---|---|---|---|
0 | 100.0 | 89.0 | 90.0 | 90.0 | 90.0 |
1 | 90.0 | 80.0 | 85.0 | 90.0 | 80.0 |
2 | 80.0 | 92.0 | 90.0 | 90.0 | 85.0 |
3 | 90.0 | 90.0 | 88.0 | 100.0 | 85.0 |
4 | 90.0 | 88.0 | 89.0 | 90.0 | 85.0 |
きちんと指定された値が入力されたことがわかります。
その列の値を入れてみよう。
以下の3通りのデータを欠損値にいれてみましょう。
- 1つ上のデータ
- 1つ下のデータ
# 欠損値の上の行の値を代入 df_up = df.fillna(method = "ffill") # 欠損値の下の行の値を代入 df_down = df.fillna(method = "bfill")
df_upの結果:
Japanese | English | math | Science | social studies | |
---|---|---|---|---|---|
0 | 100.0 | NAN | 90.0 | NAN | 90.0 |
1 | 100.0 | 80.0 | 85.0 | NAN | 80.0 |
2 | 80.0 | 92.0 | 90.0 | 90.0 | 85.0 |
3 | 80.0 | 90.0 | 88.0 | 100.0 | 85.0 |
4 | 90.0 | 88.0 | 88.0 | 90.0 | 85.0 |
欠損値の上に行がない場合は欠損値データのままになりました。
また、NANの上がNANのものも欠損値のままになりました。
df_downの結果:
Japanese | English | math | Science | social studies | |
---|---|---|---|---|---|
0 | 100.0 | 80.0 | 90.0 | 90.0 | 90.0 |
1 | 80.0 | 80.0 | 85.0 | 90.0 | 80.0 |
2 | 80.0 | 92.0 | 90.0 | 90.0 | 85.0 |
3 | 90.0 | 90.0 | 88.0 | 100.0 | NAN |
4 | 90.0 | 88.0 | NAN | 90.0 | NAN |
欠損値の下に行がない場合、欠損値データのままになりました。
また、NANの下の行がNANのものも欠損値のままになりました。
<最終更新日:2021/10/01>
2021/10/01 投稿
DataFrameの欠損値についての取り扱い方法 その3 置き換える
前回までは欠損値を削除する方法をまとめました。
今回は欠損値をあるデータに置き換える(穴埋めする)
という方法をまとめていきたいと思います。
欠損値を置き換えるとは?
欠損値に何か仮の値を入れるということですね。
例えば・・・
- 欠損値全てに「0」を入れる
- 列ごとに欠損値に穴埋めする値を変更する。
- その列の平均値をいれる
- その列の1個上の値を入れる
- その列の1個下の値を入れる
- その列の上下1個ずつの平均値をいれる。
などなど・・・
色々ありますが、これらはfillna()メソッドを使えば解決できそうです。
今回は上の2つ
- 欠損値全てに「0」を入れる
- 列ごとに欠損値に穴埋めする値を変更する。
こちらをまとめていきたいと思います。
ということで、さっそくやってみましょう!
今回のテストデータは
以下の欠損値がたくさんあるデータを使っていきたいと思います。
(名前や住所にまで欠損値あります)
name | age | add | English | math | |
---|---|---|---|---|---|
0 | aaa | Nan | Tokyo | 80 | 90 |
1 | bbb | 20 | Osaka | 85 | 80 |
2 | ccc | 22 | Nagoya | 90 | 85 |
3 | NaN | 20.0 | NaN | 100 | 80 |
4 | EEE | 18.0 | NaN | 90 | 90 |
data = {"name":["aaa","bbb","ccc",np.nan,"EEE"],"age":[np.nan,20,22,20,18],"add":["Tokyo","Osaka","Nagoya",np.nan,np.nan],"English":[80,85,90,100,90],"math":[90,80,85,80,90]} df = pd.DataFrame(data) #まずは全てを0にしてみましょう。 df_0 = df.fillna(0) print(df_0)
df_0の結果:
name | age | add | English | math | |
---|---|---|---|---|---|
0 | aaa | 0.0 | Tokyo | 80 | 90 |
1 | bbb | 20 | Osaka | 85 | 80 |
2 | ccc | 22 | Nagoya | 90 | 85 |
3 | 0 | 20.0 | 0 | 100 | 80 |
4 | EEE | 18.0 | 0 | 90 | 90 |
名前、年齢、住所にあった欠損値が全て「0」に置き換わりました。
列ごとに欠損値に埋める値を変えてみよう
名前や住所に「0」というのはおかしい感じがしますよね。
というわけで、今回は以下のように欠損値を埋めたいと思います。
- 名前:No_name
- 住所:Japan
- 年齢:0
ということで、やってみましょう。
df_0_new = df2.fillna({"name":"No_name","age":0,"add":"Japan"}) print(df_0_new)
df_0_newの結果:
name | age | add | English | math | |
---|---|---|---|---|---|
0 | aaa | 0.0 | Tokyo | 80 | 90 |
1 | bbb | 20.0 | Osaka | 85 | 80 |
2 | ccc | 22.0 | Nagoya | 90 | 85 |
3 | No_name | 20.0 | Japan | 100 | 80 |
4 | EEE | 18.0 | Japan | 90 | 90 |
このように列ごとに指定した通りの穴埋めを行うことができました。
次回は
- その列の平均値をいれる
- その列の1個上の値を入れる
- その列の1個下の値を入れる
- その列の上下1個ずつの平均値をいれる。
をまとめていきたいと思います。
<最終更新日:2021/09/27>
2021/09/27 投稿