DataFrameの欠損値についての取り扱い方法 その2 選んで消してみよう
先日のつづきをやっていきましょう。
先日と同じテストデータを使ってみます。
name | age | add | English | math | |
---|---|---|---|---|---|
0 | aaa | Nan | Tokyo | 80 | 90 |
1 | bbb | 20 | Osaka | 85 | 80 |
2 | ccc | 22 | Nagoya | 90 | 85 |
import pandas as pd import numpy as np data = {"name":["aaa","bbb","ccc"],"age":[np.nan,20,22],"add":["Tokyo","Osaka","Nagoya"],"English":[80,85,90],"math":[90,80,85]} df = pd.DataFrame(data)
- 欠損値(Nan)がないかを確認してみよう
# 欠損値を探してみよう
df.isnull()
isnull()の結果:
name | age | add | English | math | |
---|---|---|---|---|---|
0 | False | True | False | False | False |
1 | False | False | False | False | False |
2 | False | False | False | False | False |
isnull()メソッドを実行するとNanのところのみTrueが返ってくるのがわかります。
これよりどの行に欠損値があるかを調べてみましょう。
# 今回は行ごとのチェックなのでaxis = 1で設定します。 nnnnn = df.isnull().any(axis=1) print(nnnnn)
nnnnnの結果:
0 | True |
1 | False |
2 | Flase |
dtype: bool
これで欠損値がある行にはTrue
欠損値がない行にはFalseが入ります。
これを使って0行目を削除してみましょう。
for i in range(len(df)): if nnnnn[i] == True: d_df = df.drop(i) print(d_df)
d_dfの結果:
name | age | add | English | math | |
---|---|---|---|---|---|
1 | bbb | 20 | Osaka | 85 | 80 |
2 | ccc | 22 | Nagoya | 90 | 85 |
このように、nnnnnがTrueになっている行を削除(drop)すれば、
先日のdropna()と同じ結果を得られるようになりました。
dropna()とisnull()を使って削除するときのメリットデメリットは?
メリット | デメリット | |
---|---|---|
dropna() | 一括削除ができる プログラムが楽 処理も早い |
残しでもいいものがある時が不便 |
isnull() | 1つ1つ削除するかどうかを設定できる | プログラムが面倒 処理に時間がかかる |
このように、それぞれの処理にはメリットデメリットがあるので、
データの欠損値の処理を行う際には、
データの特徴にあった処理を選んでプログラミングをしましょう。
<最終更新日:2021/09/27>
絵のタイトルの修正。
2021/09/24 投稿
DataFrameの欠損値についての取り扱い方法 その1 とりあえず消してみよう
分析したいデータには大体が欠損値がつきものだと思います。
というわけで、まずは欠損値についてまとめてみましょう。
欠損値の取り扱いは以下の2種類かと思います。
- 削除
- 穴埋め(置き換えですね)
今回は削除についてまとめていきたいと思います。
消してしまおう!(削除)
データによっては消してしまったほうがいいものもある(かもしれません)
というこで、まずは消してしまう方法から考えていきましょう。
削除方法として
- 該当するデータを1つずつ確認して削除する方法
- 一括で変換(dropna)をする方法
の2種類があります。
テストデータを作ってみます。
name | age | add | English | math | |
---|---|---|---|---|---|
0 | aaa | Nan | Tokyo | 80 | 90 |
1 | bbb | 20 | Osaka | 85 | 80 |
2 | ccc | 22 | Nagoya | 90 | 85 |
aaaさんの年齢を欠損させておきます。
import pandas as pd import numpy as np data = {"name":["aaa","bbb","ccc"],"age":[np.nan,20,22],"add":["Tokyo","Osaka","Nagoya"],"English":[80,85,90],"math":[90,80,85]} df = pd.DataFrame(data)
- dropna()を使ってデータを一括で消去してしまおう。
df_after = df.dropna()
print(df_after)
df_afterの結果:
name | age | add | English | math | |
---|---|---|---|---|---|
1 | bbb | 20 | Osaka | 85 | 80 |
2 | ccc | 22 | Nagoya | 90 | 85 |
aaaさんのデータが全消去されました。
今回は1つのデータのみ欠損値があっただけなので、次は複数あった場合を確認してみましょう。
data2 = {"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]} df2 = pd.DataFrame(data2)
df2の結果:
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 |
これをdropna()を使って削除してみましょう。
df2_after = df2.dropna()
df2_afterの結果:
name | age | add | English | math | |
---|---|---|---|---|---|
1 | bbb | 20 | Osaka | 85 | 80 |
2 | ccc | 22 | Nagoya | 90 | 85 |
この結果からわかるように、1つでもNanデータがあるとデータは削除されることがわかります。
<最終更新日:2021/09/27>
2021/09/27:タイトルの一部と画像を修正。
2021/09/24:タイトル一部修正。画像追加。
2021/09/21 投稿