つくる:データクレンジング
このレッスンでできるようになること。5種類の乱れが入った売上CSVを、集計できる状態まで一気に掃除できるようになります。
新しい知識は出てきません。3章で覚えた道具を、正しい順番でつなぎます。
現場から届いた CSV には、次の5つが同時に入っていました。金額が 3,600円 の文字列、カテゴリの前後の空白、「しょっき」という読み替えの必要な表記、同じ行の二重登録、数量と金額の空欄です。これを1本の処理に通します。
順番が結果を変えます。掃除には正しい順序があります。
- 重複を消す。これを最初にやります。後回しにすると、他の処理を重複した行にも無駄に走らせます
- 文字列を揃える。空白を取り、表記を読み替えます。これを型変換より先にやるのは、空白が残っていると変換が落ちるからです
- 型を直す。金額からカンマと円を取り、数値にします。売上日は日付型にします
- 欠損を扱う。金額が無い行は落とし、数量の欠損は0で埋めます。最後にやるのは、型を直したあとでないと欠損の判定がずれることがあるからです
逆にすると具体的にどう困るかというと、たとえば重複を最後にすると、" 食器 " と "食器 " は掃除前には別の値なので、掃除で同じ値になった行が重複として残ってしまいます。掃除してから重複を見るほうが正しいという考え方もあり、完全に同じ行だけを重複とみなす今回は先に消して問題ありません。どちらにせよ、順番を決めて書き留めておくことが大切です。
Python
import pandas as pd
df = pd.read_csv("sales.csv")
df = df.drop_duplicates().reset_index(drop=True)
df["カテゴリ"] = df["カテゴリ"].str.strip()掃除の最後には必ず検算をします。行数、残った欠損の数、カテゴリの種類、金額の型と合計。この4つを見て想定どおりなら、集計に進んでよいという合図です。この演習では、5種類の乱れをすべて落として検算結果を返します。
要件
- drop_duplicates で重複を消して reset_index(drop=True) する
- カテゴリの前後の空白を取り、「しょっき」を「食器」に読み替える
- 金額からカンマと円を取り除いてから数値に直す
- 金額が欠けている行を落とし、数量の欠損は0で埋める
- {"rows", "dtype", "total", "categories", "remaining_na"} の5つを返す
- categories は sorted() で並べたリストにする
入出力例
clean_sales("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ, 食器 ,2,"3,600円"
2026-01-06,横浜店,鉄のフライパン,しょっき,1,"7,800円"
2026-01-05,渋谷店,白磁のマグカップ, 食器 ,2,"3,600円"
2026-02-07,大宮店,積み重ね収納ボックス,収納,,"4,500円"
2026-02-08,渋谷店,木製カッティングボード,調理器具,1,
") → {"categories":["収納","食器"],"dtype":"int64","remaining_na":0,"rows":3,"total":15900}
clean_sales("売上日,店舗,商品名,カテゴリ,数量,金額
2026-03-03,渋谷店,鋳物ホーロー鍋, 調理器具,1,"16,800円"
2026-03-03,渋谷店,鋳物ホーロー鍋, 調理器具,1,"16,800円"
2026-03-04,大宮店,白磁のマグカップ,しょっき,,"9,000円"
") → {"categories":["調理器具","食器"],"dtype":"int64","remaining_na":0,"rows":2,"total":25800}ヒント
編集 ゆめさく編集部