LEVEL 8 ・ 自動化 / Lesson 21
入力ミスのある行だけを抜き出す
空欄・マイナスなど、おかしい行だけを抜き出し、行番号を付けて、確認用ファイルに保存します。
このレッスンが終わったら
「条件を組み合わせて、おかしい行だけを抜き出せる。直す前に、まず見つけて一覧にする」と言える。
できることを見る
入力ミスのあるデータを、ひとつずつ目で探すのは大変です。Pythonに、おかしい行だけを抜き出してもらいましょう。
ここに、入力ミスが混ざった sales_dirty.csv があります。
日付,担当,部署,商品,金額 2025-10-01,田中,営業,ノートPC,120000 2025-10-02,佐藤,営業,モニター, 2025-10-03,鈴木,企画,ソフト,48000 2025-10-05,,営業,モニター,35000 2025-10-07,高橋,企画,ノートPC,-120000 2025-10-08,佐藤,営業,ソフト,48000 2025-10-10,鈴木,,モニター,35000 2025-10-12,伊藤,総務,ソフト,48000
空欄や、マイナスの金額が、混ざっています。これを、Pythonで見つけます。
import pandas as pd
df = pd.read_csv("sales_dirty.csv")
print(df)動かしてみる
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
空欄の所は、NaN(ナン)と表示されます。「値が入っていない」という意味です。また、金額に空欄があるため、数字が 120000.0 のように、小数の形になっています。
1行ずつ読む
「おかしい行」を、条件で表します。
df["金額"].isna()金額が空欄(NaN)か、調べる。空欄なら Truedf["金額"] < 0金額がマイナスか、調べる。マイナスなら Truedf["担当"].isna()担当が空欄か、調べる条件A | 条件BA、または B(どちらかに当てはまれば True)df[ 条件 ]条件が True の行だけを取り出す条件をつなぐ | は、「または」でした。次のコードで、4つの条件のどれかに当てはまる行を、抜き出します。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
日本語にすると
8行のうち、4行が、問題のある行でした。
1か所だけ変える
① 行番号を付ける。 Excelで探しやすいように、「元のファイルの何行目か」を付けます。見出しが1行目なので、データは、行番号に2を足した行にあたります。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
② 結果をファイルに保存する。 確認用に、errors.csv として保存します。(Excelで開いても文字化けしないように、utf-8-sig を付けます)
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
③ 空欄の数を、列ごとに数える。 isna().sum() で、列ごとの空欄の数が分かります。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
④ 問題のない行だけで集計する。 おかしい行を取り除いてから、集計します。drop は、指定した行を取り除きます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
自分で書く
お題① 金額がマイナスの行が、何行あるかを表示してください。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
df[df["金額"] < 0] で、マイナスの行を取り出し、len(...) で数えます。
答えの例を見る
import pandas as pd
df = pd.read_csv("sales_dirty.csv")
print(len(df[df["金額"] < 0]))お題② 「担当が空欄」または「部署が空欄」の行が、何行あるかを表示してください。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
df[df["担当"].isna() | df["部署"].isna()] の行数を、len(...) で数えます。
答えの例を見る
import pandas as pd
df = pd.read_csv("sales_dirty.csv")
print(len(df[df["担当"].isna() | df["部署"].isna()]))