1.今回用いるデータ
私はpythonでとても重要なデータクレンジングについて、様々な記事を書いております。
その中で今回用いるのは
『データクレンジングを行ってみよう!価格変更偏』の1番にあるデータを使っていきます。
良かったらダウンロードしてみてください。それではいきます
2.データの読み込み
import pandas as pd
kokyaku_data = pd.read_excel("kokyaku_daicho.xlsx")
kokyaku_dataは人が入力していると思われるので、とても汚いデータとなっております。
顧客名については、半角の空欄があったり全角の空欄があったり
登録日については、記述がばらばらであったりします
今回は、その2つをきれいにクレンジングしていきましょう。
kokyaku_data
顧客名 かな 地域 メールアドレス 登録日
0 須賀ひとみ すが ひとみ H市 suga_hitomi@example.com 2018/01/04
1 岡田 敏也 おかだ としや E市 okada_toshiya@example.com 42782
2 芳賀 希 はが のぞみ A市 haga_nozomi@example.com 2018/01/07
3 荻野 愛 おぎの あい F市 ogino_ai@example.com 42872
4 栗田 憲一 くりた けんいち E市 kurita_kenichi@example.com 43127
... ... ... ... ... ...
195 川上 りえ かわかみ りえ G市 kawakami_rie@example.com 2017/06/20
196 小松 季衣 こまつ としえ E市 komatsu_toshie@example.com 2018/06/20
197 白鳥 りえ しらとり りえ F市 shiratori_rie@example.com 2017/04/29
198 大西 隆之介 おおにし りゅうのすけ H市 oonishi_ryuunosuke@example.com 2019/04/19
199 福井 美希 ふくい みき D市 fukui_miki1@example.com 2019/04/23
3.顧客名をきれいにしよう
改めて顧客名を見ていきますか
0番は苗字と名前の間にスペースがありません。
1番は間が全角
2番は間が半角となっていて汚れておりますね
kokyaku_data["顧客名"]
0 須賀ひとみ
1 岡田 敏也
2 芳賀 希
3 荻野 愛
4 栗田 憲一
...
195 川上 りえ
196 小松 季衣
197 白鳥 りえ
198 大西 隆之介
199 福井 美希
Name: 顧客名, Length: 200, dtype: object
これを解決するためには、astype
メソッドとreplace
を用いれば解決できます。
replace(" " , "")
としているのは半角の空欄から空欄なしにしています。
みてみると、1番は変更されていないものの、他は間がなくなっています。
kokyaku_data["顧客名"].astype("str").str.replace(" " , "")
0 須賀ひとみ
1 岡田 敏也
2 芳賀希
3 荻野愛
4 栗田憲一
...
195 川上りえ
196 小松季衣
197 白鳥りえ
198 大西隆之介
199 福井美希
全角の間も同様な処理をしていきます。
# 半角空欄から空欄なし
kokyaku_data["顧客名"]=kokyaku_data["顧客名"]=kokyaku_data["顧客名"].astype("str").str.replace(" " , "")
# 全角空欄から空欄なし
kokyaku_data["顧客名"]=kokyaku_data["顧客名"]=kokyaku_data["顧客名"].astype("str").str.replace(" " , "")
みていきます
kokyaku_data["顧客名"]
0 須賀ひとみ
1 岡田敏也
2 芳賀希
3 荻野愛
4 栗田憲一
...
195 川上りえ
196 小松季衣
197 白鳥りえ
198 大西隆之介
199 福井美希
Name: 顧客名, Length: 200, dtype: object
いい感じになりましたね。
それでは次にいきましょう。
4.日付データの変更
まずはデータを見ていきます
数値になっているものがあることがみられます。
kokyaku_data["登録日"]
0 2018/01/04
1 42782
2 2018/01/07
3 42872
4 43127
...
195 2017/06/20
196 2018/06/20
197 2017/04/29
198 2019/04/19
199 2019/04/23
Name: 登録日, Length: 200, dtype: object
ここで、数字の登録日をほかの時間とどうようにしていきたいと思います。
まずは数字がどこにあるのかを探していきます。
astype("str")
でいったん文字列とし、その中で数字があればTrueを返してくれるstr.isdigit()
を使って、特定していきます。
kokyaku_data["登録日"].astype("str").str.isdigit()
0 False
1 True
2 False
3 True
4 True
...
195 False
196 False
197 False
198 False
199 False
Name: 登録日, Length: 200, dtype: bool
これを変数に格納していき、それをlocメソッドで条件として抽出する作業をします。
二行目以降の説明をします。
まずは、数字となっている行且つ登録日
を整数にし、それをtime_delta
で日付単位にします
その後、それを他の日付単位に合わせるためにto_datetime
で以下のような記述をします。
flg_is_serial = kokyaku_data["登録日"].astype("str").str.isdigit()
fromSerial = pd.to_timedelta(kokyaku_data.loc[flg_is_serial, "登録日"].astype("float"), unit="D") + pd.to_datetime("1900/01/01")
これでデータを見ていきましょう。
dtypeがdatetimeになっていることが分かります。
時系列データの分析を行う際は、この処理が欠かせないので忘れずに覚えておきましょう。
fromSerial
1 2017-02-18
3 2017-05-19
4 2018-01-29
21 2017-07-06
27 2017-06-17
47 2017-01-08
49 2017-07-15
53 2017-04-10
76 2018-03-31
80 2018-01-12
99 2017-06-01
114 2018-06-05
118 2018-01-31
122 2018-04-18
139 2017-05-27
143 2017-03-26
155 2017-01-21
172 2018-03-24
179 2017-01-10
183 2017-07-26
186 2018-07-15
192 2018-06-10
Name: 登録日, dtype: datetime64[ns]