らふのプログラミングメモ

プログラミングメモです。

DataFrameの欠損値についての取り扱い方法 その4 前後のデータをコピーする

前回↓の続きです。

rafu.hatenablog.jp

前回の終わりに次回予告のようになっていた以下について

  • その列の平均値をいれる
  • その列の1個上の値を入れる
  • その列の1個下の値を入れる

をまとめていきたいと思います。

パネル:DataFrameの欠損値データを穴埋めしてみよう
DataFrameの欠損値データを穴埋めしてみよう
 

テストデータの準備

以下のようなテストデータを準備します。

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 置き換える

前回までは欠損値を削除する方法をまとめました。

rafu.hatenablog.jp

rafu.hatenablog.jp

今回は欠損値をあるデータに置き換える(穴埋めする)
という方法をまとめていきたいと思います。

パネル:DataFrameの欠損値にデータを穴埋めしてみよう。
DataFrameの欠損値にデータを穴埋めしてみよう。

欠損値を置き換えるとは?

欠損値に何か仮の値を入れるということですね。

例えば・・・

  • 欠損値全てに「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 投稿