つくる:データクレンジング
このレッスンでできるようになること。5種類の乱れが入った売上CSVを、集計できる状態まで一気に掃除できるようになります。
新しい知識は出てきません。3章で覚えた道具を、正しい順番でつなぎます。
現場から届いた CSV には、次の5つが同時に入っていました。金額が 3,600円 の文字列、カテゴリの前後の空白、「しょっき」という読み替えの必要な表記、同じ行の二重登録、数量と金額の空欄です。これを1本の処理に通します。
順番が結果を変えます。掃除には正しい順序があります。
- 重複を消す。これを最初にやります。後回しにすると、他の処理を重複した行にも無駄に走らせます
- 文字列を揃える。空白を取り、表記を読み替えます。これを型変換より先にやるのは、空白が残っていると変換が落ちるからです
- 型を直す。金額からカンマと円を取り、数値にします。売上日は日付型にします
- 欠損を扱う。金額が無い行は落とし、数量の欠損は0で埋めます。最後にやるのは、型を直したあとでないと欠損の判定がずれることがあるからです
逆にすると具体的にどう困るかというと、たとえば重複を最後にすると、" 食器 " と "食器 " は掃除前には別の値なので、掃除で同じ値になった行が重複として残ってしまいます。掃除してから重複を見るほうが正しいという考え方もあり、完全に同じ行だけを重複とみなす今回は先に消して問題ありません。どちらにせよ、順番を決めて書き留めておくことが大切です。
たとえば参加者名簿でも、完全に同じ行の重複を除き、学年の空白を揃える順を決められます。
Python
import pandas as pd
participants = pd.read_csv("participants.csv")
participants = participants.drop_duplicates().reset_index(drop=True)
participants["学年"] = participants["学年"].str.strip()掃除の最後には必ず検算をします。行数、残った欠損の数、カテゴリの種類、金額の型と合計。この4つを見て想定どおりなら、集計に進んでよいという合図です。この演習では、5種類の乱れをすべて落として検算結果を返します。
欠損を含む数値は、そのまま整数型にできません。数値化、欠損除去、整数化の順にします。たとえば図書館の延滞日数なら、次のように扱えます。
Python
loans = pd.DataFrame({"延滞日数": ["4", "不明", "2"]})
loans["延滞日数"] = pd.to_numeric(loans["延滞日数"], errors="coerce")
loans = loans.dropna(subset=["延滞日数"]).copy()
loans["延滞日数"] = loans["延滞日数"].astype("int64")errors="coerce" は変換できない文字を欠損にします。.copy() は残した行を独立した表にします。astype("int64") は整数型を明示する書き方です。演習では金額が無い行を除き、数量は0で埋めてから、両方をこの型にします。重複とカテゴリの整形、検算辞書の作成はひな形にあります。_audit は検算だけを行い、金額の掃除は行いません。
要件
- 重複除去とカテゴリ整形、検算辞書の作成はひな形のまま使う
- 金額からカンマと円を除き、pd.to_numeric の errors="coerce" で数値化する
- 金額が欠損の行を dropna で除き、数量の欠損を0で埋める
- 欠損処理後の金額と数量を astype("int64") で整数型にする。dtype は "int64" を返す
- 返す5項目は rows、dtype、total、categories、remaining_na。categories は昇順、残った欠損は0