困っている人
- Pandasで欠損値を削除する方法を知りたい
- また、欠損値を穴埋めする方法も知りたい
- 欠損値の削除・穴埋めの具体的な操作を教えてほしい
- Pandasで欠損値を削除する方法(dropna)が分かる
- 欠損値を穴埋めする方法(fillna)が分かる
- 欠損値の削除・穴埋めの具体的な操作が分かる
この記事を書いている人
プログラミング(Python・Django・SQL・HTML・css・Bootstrapなど)を独学で習得。「Excel作業の自動化」「人工知能による予測」「Webアプリ開発」「Webスクレイピング」で業務改善×システム化を得意にしています。
Pythonによる欠損値の削除・穴埋め
「欠損値の削除」と「欠損値の穴埋め」は、データ分析の前処理によく使われるテクニックです。
データ分析の現場では、全ての情報が完璧に揃っていることは稀で、データが一部欠損している場合があります。その際は、欠損値に適切な処理が必要です。
No. | 商品名 | 単価 | 内容 |
1 | りんご | 150 | 両方ともデータがある |
2 | みかん | NaN | 一方だけデータがある |
3 | NaN | NaN | 両方ともデータがない |
今回は、Pandasのデータフレームにおける、「欠損値の削除」と「欠損値の穴埋め」を解説していきます。データ分析の前処理に欠かせないテクニックなので、ぜひ参考にしてください。
Pythonによる欠損値の削除・穴埋め方法
今回紹介する欠損値の削除と穴埋め方法の一覧です。No.1〜No.7までを順に説明していきます。
No. | 基本形 | 説明 |
1 | dropna(how=”all”) | 欠損値(全ての行)の削除 |
2 | dropna(how=”any”) | 欠損値(どれか一つ)の削除 |
3 | fillna(300).astype(int) | 欠損値を数値(300)で穴埋め |
5 | fillna(method = ‘ffill’).astype(int) | 欠損値を一つ前の数値で穴埋め |
6 | fillna(df.mean()).astype(int) | 欠損値を平均値(数値)で穴埋め |
7 | fillna(df.median()).astype(int) | 欠損値を中央値(数値)で穴埋め |
Pythonによる欠損値の削除・穴埋め方法のサンプルデータ
この記事では以下のサンプルデータを使います。よろしければ、ダウンロードしてご利用ください。
[st-mybox title=”” fontawesome=”” color=”#757575″ bordercolor=”#7ca1b7″ bgcolor=”#ffffff” borderwidth=”2″ borderradius=”2″ titleweight=”bold” fontsize=”” myclass=”st-mybox-class” margin=”25px 0 25px 0″]
- 商品単価(’ item_price‘)
[/st-mybox]
また、GoogleColabへのサンプルデータ(Excelファイル)の読み込み方法については、以下の記事を参考にしてください。
[st-card id=180 label=”” name=”” bgcolor=”” color=”” fontawesome=”” readmore=”on”]
欠損値を削除する方法(dropnaメソッド)
それでは、欠損値を削除する方法から説明していきます。まずはExcelファイルを読み込んでください。
Excelファイル(data_1)の読み込み
Pandasを使ってExcelファイルを読み込みます。「単価」の列を見ると、いくつか空白(NaN)があることが分かります。特に、7行目と8行目は「商品名」も「単価」も空白になっていることを覚えておいてください。
import pandas as pd
df_1=pd.read_excel('/content/item_price.xlsx')
df_1
1.pandasをインポート
2.変数(df_1)にExcelファイルから読み込んだデータフレームを代入
3.変数(df_1)を出力
欠損値の削除「dropna(how=”all”)」
まず、「商品名」と「単価」が両方とも欠損している、7行目と8行目のデータを削除します。「how=”all”」を使うことで、全ての行で欠損しているデータを削除できます。
df_1.dropna(how="all")
df_1
1.変数(df_1)に、欠損しているデータ(全て)を削除したデータフレーム を代入
2.変数(df_1)を出力
欠損値の削除「dropna(how=”any”)」
次に、「商品名」と「単価」のどちらかが欠損しているデータを削除します。下記のとおり、2行目と4行目のデータが削除されています。「how=”any”」を使うと、どれか一つでも欠損していればデータを削除します。
df_2=df_1.dropna(how="any")
df_2
1.変数(df_2)に、欠損しているデータ(どれか一つ)を削除したデータフレーム を代入
2.変数(df_2)を出力
Pythonで欠損値を穴埋めする方法(fillnaメソッド)
欠損値の穴埋めには以下の方法があります。中でも、よく使われる方法について具体的に説明していきます。
[st-mybox title=”” fontawesome=”” color=”#757575″ bordercolor=”#7ca1b7″ bgcolor=”#ffffff” borderwidth=”2″ borderradius=”2″ titleweight=”bold” fontsize=”” myclass=”st-mybox-class” margin=”25px 0 25px 0″]
・任意の値を指定して穴埋め
・列データの前後の値を指定して穴埋め
・列データの平均値、中央値、最頻値で穴埋め
[/st-mybox]
欠損値を”任意の値”で指定して穴埋め
「単価」の列データの欠損値を、任意の値(300)を指定して穴埋めします。「単価_1」に穴埋め後のデータが表示されています。
df_1['単価_1']=df_1['単価'].fillna(300).astype(int)
df_1
1.変数(df_1[‘単価_1’])に、欠損値を300(数値)に穴埋めしたデータを代入
2.変数(df_1)を出力
欠損値を列データの”前の値”で指定して穴埋め
「単価」の列データの欠損値を、一つ前の値を指定して穴埋めします。「単価_1」に穴埋め後のデータが表示されています。
df_1['単価_1']=df_1['単価'].fillna(method = 'ffill').astype(int)
df_1
1.変数(df_1[‘単価_1’])に、一つ前のデータで穴埋めしたデータを代入
2.変数(df_1)を出力
欠損値を列データの”平均値”で穴埋め
「単価」の列データの平均値で穴埋めします。「単価_平均」に穴埋め後のデータが表示されています。
df_1['単価_平均']=df_1['単価'].fillna(df_1['単価'].mean()).astype(int)
df_1
1.変数(df_1[‘単価_平均’])に、欠損値を単価の列データの平均で穴埋めしたデータを代入
2.変数(df_1)を出力
欠損値を列データの”中央値”で穴埋め
「単価」の列データの中央値で穴埋めします。「単価_中央値」に穴埋め後のデータが表示されています。
df_1['単価_中央値']=df_1['単価'].fillna(df_1['単価'].median()).astype(int)
df_1
1.変数(df_1[‘単価_平均’])に、欠損値を単価の列データの平均で穴埋めしたデータを代入
2.変数(df_1)を出力
Pythonによる欠損値の削除と穴埋め方法まとめ
Pythonによる「欠損値の削除」と「欠損値の穴埋め」について解説しました。
もし、使用するデータに欠損値がある場合は、適切な処理を行う必要があります。欠損値をそのままにして分析してしまうと、間違った結果を出す可能性があるからです。
今回ご紹介した「dropnaメソッド」と「fillnaメソッド」は、欠損値を一括で処理できる便利なメソッドなので、参考にしてください。
最後まで読んでいただき、ありがとうございます。