欠損値の置換

pandasで特定のデータを置換するには、たとえば次のようなメソッドがあります。

  • mask(条件式, 置換後の値): 指定した条件に一致するデータを置換する
  • where(条件式, 置換後の値): 指定した条件に一致しないデータを置換する
  • apply(関数): 全ての行に対して、指定した関数を適用する。より複雑なルールで値を置換したいときに便利。

たとえばmask()を使って「列Aが負の値の場合、列Aの値を0で置換する」ケースでは、df["A"].mask(df["A"] < 0, 0)のように書きます。

https://images.pyq.jp/repo/prod/pandas_start_02_cleaning/mask.jpg

mask()などのメソッドを実行しただけでは、元の列の値は更新されません。
元の列を更新するには、df[既存の列] = 更新後の値 のように=を使って更新後の値を代入します

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無所属
# 列Clubの値の種類と件数を表示
df["Club"].value_counts()
美術部      2
野球部      1
合唱部      1
サッカー部    1
所属なし     1
無所属      1
Name: Club, dtype: int64

表記揺れがないか確認するために、列Club の値の種類を確認しましょう。value_counts() を使うと、指定した列の値の種類と件数を表示できます。次のコードを実行すると、”美術部”のデータが2件、それ以外のデータはそれぞれ1件ずつあることがわかります。

この内”無所属”と”所属なし”は、どちらも「加入している部活はない」という同じ意味のように見えます。実務の場合、このような判断に迷うデータがあるときは、データの仕様書を参照したりデータの入手元に問い合わせたりして、データの背景を確認します。

今回は、”無所属”と”所属なし”は表記揺れしているものとし、“所属なし”に統一することにしましょう。mask(条件式, 値)のように書くと、条件に一致するデータを指定した値で置換します。次のコードを実行すると、”無所属”の値が”所属なし”に変わることがわかります。

# 列Clubの値が「無所属」に一致するものを「所属なし」に置換する。
df["Club"].mask(df["Club"] == "無所属", "所属なし")
0      野球部
1      合唱部
2      美術部
3      美術部
4    サッカー部
5     所属なし
6     所属なし
Name: Club, dtype: object

最後に、置換後の値で列Clubを更新しましょう。df[既存の列名] = 更新後の値 とすると、既存の列を新しい値で更新できます。次のコードを実行すると、列Clubが置換後の値で置き換わっていることがわかります。

置換の作業を入れないと、(df[“Club”]=を入れないと)表は更新されない。

# 置換後の列を代入
df["Club"] = df["Club"].mask(df["Club"] == "無所属", "所属なし")
# 代入後のDataFrameの中身を確認
df
NameHeightWeightClub
0佐藤17253.0野球部
1田中-150.0合唱部
2鈴木165NaN美術部
3高橋17059.0美術部
4伊藤16654.0サッカー部
5山本15651.0所属なし
6渡辺16358.0所属なし

コメント

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