欠損値の除去

pandasには、欠損値の確認や対応のための機能がいろいろ備わっています。たとえば、次のような関数です。

  • 欠損値を確認する: info()isna()など
  • 欠損値を含む行を削除する: dropna()
  • 欠損値を他の値で置換する: fillna()
import pandas as pd

# データの読み込み
df = pd.read_csv("dataset/physical_measurement_dirty.csv")
df
NameHeightWeightClub
0佐藤17253.0野球部
1田中-150.0合唱部
2鈴木165NaN美術部
3高橋17059.0美術部
4伊藤16654.0サッカー部
5山本15651.0所属なし
6渡辺16358.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、列Weight6 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()]
NameHeightWeightClub
2鈴木165NaN美術部

さらに、df[df[列名].isna()]とすると、指定した列が欠損している行だけを絞り込めます。以下のコードを実行すると、列Weightが欠損している”鈴木”さんの行だけが表示されます。列WeightNaNは、欠損値を意味しています。

# 列Weightに欠損値がある行を削除する
df_after = df.dropna(subset=["Weight"])
df_after
NameHeightWeightClub
0佐藤17253.0野球部
1田中-150.0合唱部
3高橋17059.0美術部
4伊藤16654.0サッカー部
5山本15651.0所属なし
6渡辺16358.0無所属

欠損値への対処方法はいろいろありますが、今回は欠損値を含む行自体を削除することにします。

dropna(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()]
NameHeightWeightClub

また、先ほど同様isna()を使って欠損値を含む行を絞り込んでみましょう。実行すると1行も表示されず、期待通り欠損値を含む行が削除されていることがわかります。

コメント

タイトルとURLをコピーしました