1.価格データを一括で変更したい
今回は、https://www.shuwasystem.co.jp/support/7980html/5875.htmlでダウンロードできるデータを扱っていきます。
これは、『実践データ分析100本ノック』という本のサンプルコードになっております。本を見ながらみるととても分かりやすいと思うので、是非手に取ってみてください。
(ステマではありません!(笑))
2.データの読み込みや問題点の抽出
では、この中の第二章に入っている
uriage.csvを取り出していきます。
import pandas as pd
uriage_data = pd.read_csv("uriage.csv")
uriage_data.head()
purchase_date item_name item_price customer_name
0 2019-06-13 18:02:34 商品A 100.0 深井菜々美
1 2019-07-13 13:05:29 商 品 S NaN 浅田賢二
2 2019-05-11 19:42:07 商 品 a NaN 南部慶二
3 2019-02-12 23:40:45 商品Z 2600.0 麻生莉緒
4 2019-04-22 03:09:35 商品a NaN 平田鉄二
ここには、誰がいつなにを買ったのかという架空のデータが存在します。
商品名が小文字と大文字が入れ混じっていたりと他にも直さなければならない場所が存在しますが、今回はitem_price
について絞ってデータクレンジングを行っていきたいと思います。
3.本題!データクレンジング
item_name
のクレンジングは説明を省略します。良かったら参考にしてください。
uriage_data["item_name"] = uriage_data["item_name"].str.upper()
##小文字を大文字に変える
uriage_data["item_name"] = uriage_data["item_name"].str.replace(" " , "")
##半角スペースを無くす
uriage_data["item_name"] = uriage_data["item_name"].str.replace(" " , "")
##全角スペースを無くす
uriage_data["item_name"].sort_values()
0 商品A
1748 商品A
223 商品A
1742 商品A
1738 商品A
...
2880 商品Y
2881 商品Y
1525 商品Y
1361 商品Y
3 商品Z
Name: item_name, Length: 2999, dtype: object
それでは、item_name
とitem_price
をデータフレーム型にしましょう。
uriage_data[["item_price" , "item_name"]]
item_price item_name
0 100.0 商品A
1 NaN 商品S
2 NaN 商品A
3 2600.0 商品Z
4 NaN 商品A
... ... ...
2994 2500.0 商品Y
2995 1300.0 商品M
2996 NaN 商品Q
2997 NaN 商品H
2998 400.0 商品D
おや、同じ商品名なのに欠損値がありますね。
基本的には、商品名の価格は変わらないという前提の上、この欠損値をまとめて変えましょう。
# 欠損値データをTrueで返す (また、~を用いることによって、欠損値ではないデータも抽出できる)
flg_is_null = uriage_data["item_price"].isnull()
# 欠損値があるデータのアイテムネームをリスト形式で抽出する
for trg in list (uriage_data.loc[flg_is_null , "item_name"].unique()):
# 欠損値のないアイテムネームの行 かつ 欠損値のあるアイテムネームのitem_priceを price変数にする
price = uriage_data.loc[(~flg_is_null) & (uriage_data["item_name"] == trg) , "item_price" ].max()
# アイテムプライスを呼び出して、その中の欠損値の起こしているアイテムデータを抽出し、それをpriceする
uriage_data["item_price"].loc[(flg_is_null) & (uriage_data["item_name"]==trg)] = price
一行目では、欠損値のアイテムネーム名をリストで返しています。繰り返し処理を行うにはリストにしておく必要があります。
また、3行目でitem_name
ごと一括でitem_price
の変更を行っているので、ここでは無駄な繰り返しを省くためunique()
を使って、ユニークな値のみを繰り返しにさせています。
二行目では、簡潔に伝えると『しっかり値が入っているアイテム名の価格をprice
にする』ということです。
~fig_is_null
(欠損値ではないもののbool値)かつ欠損値が存在するitem_name
のitem_price
の最大値をprice
にしています。
三行目では、欠損値が入っているitem_name
のitem_price
をprice
にまとめて置き換える
4.確認
そうすることによって、以下のようになります。
uriage_data[["item_price" , "item_name"]]
item_price item_name
0 100.0 商品A
1 1900.0 商品S
2 100.0 商品A
3 2600.0 商品Z
4 100.0 商品A
... ... ...
2994 2500.0 商品Y
2995 1300.0 商品M
2996 1700.0 商品Q
2997 800.0 商品H
2998 400.0 商品D
2999 rows × 2 columns
uriage_data["item_price"].isnull().sum()
0
欠損値がなく、正常に値が入っていそうです。
以上で価格変更のクレンジング作業でした。
for文を上手く活用して、処理能力を高めていきたいです!