1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

データクレンジングを行ってみよう!価格変更偏

Last updated at Posted at 2022-08-20

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_nameitem_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_nameitem_priceの最大値をpriceにしています。

三行目では、欠損値が入っているitem_nameitem_pricepriceにまとめて置き換える

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文を上手く活用して、処理能力を高めていきたいです!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?