pandasには、欠損値の確認や対応のための機能がいろいろ備わっています。たとえば、次のような関数です。
- 欠損値を確認する:
info()
,isna()
など - 欠損値を含む行を削除する:
dropna()
- 欠損値を他の値で置換する:
fillna()
import pandas as pd
# データの読み込み
df = pd.read_csv("dataset/physical_measurement_dirty.csv")
df
Name | Height | Weight | Club | |
---|---|---|---|---|
0 | 佐藤 | 172 | 53.0 | 野球部 |
1 | 田中 | -1 | 50.0 | 合唱部 |
2 | 鈴木 | 165 | NaN | 美術部 |
3 | 高橋 | 170 | 59.0 | 美術部 |
4 | 伊藤 | 166 | 54.0 | サッカー部 |
5 | 山本 | 156 | 51.0 | 所属なし |
6 | 渡辺 | 163 | 58.0 | 無所属 |
df.shape
(7, 4)
shape
を使ってDataFrameの形状を確認すると、7行4列であることがわかります。
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Name 7 non-null object
1 Height 7 non-null int64
2 Weight 6 non-null float64
3 Club 7 non-null object
dtypes: float64(1), int64(1), object(2)
memory usage: 352.0+ bytes
欠損値の有無を調べる方法はいろいろありますが、まずはinfo()
メソッドを使ってみましょう。 info()
を使うと、各列の「欠損値ではない行の数」や型、DataFrameのメモリ使用量などの情報を確認できます。
次のコードを実行して、結果を眺めてみましょう。「欠損値ではない行の数」はNon-Null Count項目で確認できます。今回の実行結果では、列Weight
以外は7 non-null
、列Weight
は6 non-null
と表示されています。今回のDataFrameは全部で7行なので、列Weight
には欠損値が1件あることがわかります。
df["Weight"].isna()
0 False
1 False
2 True
3 False
4 False
5 False
6 False
Name: Weight, dtype: bool
具体的にどの行に欠損値があるのか確認してみましょう。df[列名].isna()
とすると、指定した列について欠損値であればTrue
、欠損値でなければFalse
が格納された結果が得られます。実行すると、上から3行目(行名 2
)のデータがTrue
になっていることがわかります。
# 列Weightに欠損値を含む行を絞り込んで表示
df[df["Weight"].isna()]
Name | Height | Weight | Club | |
---|---|---|---|---|
2 | 鈴木 | 165 | NaN | 美術部 |
さらに、df[df[列名].isna()]
とすると、指定した列が欠損している行だけを絞り込めます。以下のコードを実行すると、列Weight
が欠損している”鈴木”さんの行だけが表示されます。列Weight
のNaN
は、欠損値を意味しています。
# 列Weightに欠損値がある行を削除する
df_after = df.dropna(subset=["Weight"])
df_after
Name | Height | Weight | Club | |
---|---|---|---|---|
0 | 佐藤 | 172 | 53.0 | 野球部 |
1 | 田中 | -1 | 50.0 | 合唱部 |
3 | 高橋 | 170 | 59.0 | 美術部 |
4 | 伊藤 | 166 | 54.0 | サッカー部 |
5 | 山本 | 156 | 51.0 | 所属なし |
6 | 渡辺 | 163 | 58.0 | 無所属 |
欠損値への対処方法はいろいろありますが、今回は欠損値を含む行自体を削除することにします。
dro
pna(subset=削除する列名のリスト)
とすると、指定した列に欠損値が含まれる行を削除できます。下記のコードを実行すると、先ほど確認した”鈴木”さんの行がなくなっていることがわかります。
print(df.shape) # 削除前のDataFrameの行数・列数
print(df_after.shape) # 削除後のDataFrameの行数・列数
(7, 4) (6, 4)
shape
を使って、削除前と削除後のDataFrameの行数を確認してみましょう。7行4列から6行4列になり、1行減っていることがわかります。
df_after[df_after["Weight"].isna()]
Name | Height | Weight | Club |
---|
また、先ほど同様isna()
を使って欠損値を含む行を絞り込んでみましょう。実行すると1行も表示されず、期待通り欠損値を含む行が削除されていることがわかります。
コメント