pandasで特定のデータを置換するには、たとえば次のようなメソッドがあります。
mask(条件式, 置換後の値)
: 指定した条件に一致するデータを置換するwhere(条件式, 置換後の値)
: 指定した条件に一致しないデータを置換するapply(関数)
: 全ての行に対して、指定した関数を適用する。より複雑なルールで値を置換したいときに便利。
たとえばmask()
を使って「列A
が負の値の場合、列A
の値を0
で置換する」ケースでは、df["A"].mask(df["A"] < 0, 0)
のように書きます。
mask()
などのメソッドを実行しただけでは、元の列の値は更新されません。
元の列を更新するには、df[既存の列] = 更新後の値
のように=
を使って更新後の値を代入します。
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 | 無所属 |
# 列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
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 | 所属なし |
コメント