基礎から学ぶPython入門 90日コース | 業務自動化 - Day 37:pandasデータ加工

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

Day 37:pandasデータ加工で「欲しい形に整える力」を身につける

Day 37では、pandasを使って データを思い通りの形に加工する ことを目標にします。 業務自動化では、「データを読み込むだけ」ではなく、必要な列だけ取り出す・条件で絞る・並べ替える・欠損値を処理する・型を揃える といった加工が必須になります。

扱うキーワードは次の6つです。

  • 列選択
  • 行選択
  • 条件抽出
  • ソート
  • 欠損値
  • 型変換

ここでは、初心者向けにかみ砕いて、 「よくある業務データ」を例にしながら、ステップバイステップで説明していきます。

サンプルデータの準備:少し“業務っぽい”CSVを作る

まずは、Day 37で使うサンプルCSVを作ります。 売上データに、わざと欠損値や文字列の数値を混ぜておきます。

# day37_make_csv.py
def create_sample_csv(filename="sales_day37.csv"):
    """Day 37用のサンプルCSVファイルを作成する関数です。"""
    content = """日付,店舗,商品名,数量,単価,売上
2024-01-01,A,りんご,10,120,1200
2024-01-01,B,みかん,8,100,800
2024-01-01,C,ぶどう,,300,
2024-01-02,A,りんご,5,120,600
2024-01-02,B,みかん,abc,100,1000
2024-01-02,C,ぶどう,3,300,900
"""

    with open(filename, "w", encoding="utf-8") as f:
        f.write(content)

    print(f"{filename} を作成しました。")


if __name__ == "__main__":
    create_sample_csv()
Python

ポイント:

  • 3行目の「数量」と「売上」が空欄(欠損値)になっています。
  • 5行目の「数量」が abc という文字列になっていて、数値として扱えません。

このような「きれいではないデータ」を、pandasで整えていきます。

基本:CSVを読み込んでDataFrameを確認する

import pandas as pd


def load_data():
    """CSVを読み込んで基本情報を確認する例です。"""
    df = pd.read_csv("sales_day37.csv")

    print("=== 読み込んだDataFrame ===")
    print(df)

    print("\n=== 列のデータ型 ===")
    print(df.dtypes)

    print("\n=== 行数・列数 ===")
    print(df.shape)

    return df


if __name__ == "__main__":
    load_data()
Python

ここでのポイント:

  • pd.read_csv() でCSVをDataFrameとして読み込んでいること。
  • df.dtypes で各列の型を確認できること(数量や単価が「object」になっている場合があります)。

列選択:必要な列だけに絞る

1列だけ選ぶ

import pandas as pd


def select_columns_example():
    df = pd.read_csv("sales_day37.csv")

    # 「商品名」列だけを取り出します。
    product_series = df["商品名"]

    print("=== 商品名列(Series) ===")
    print(product_series)


if __name__ == "__main__":
    select_columns_example()
Python

複数列を選ぶ

import pandas as pd


def select_multiple_columns_example():
    df = pd.read_csv("sales_day37.csv")

    # 「日付」「店舗」「売上」だけを取り出します。
    selected_df = df[["日付", "店舗", "売上"]]

    print("=== 日付・店舗・売上だけのDataFrame ===")
    print(selected_df)


if __name__ == "__main__":
    select_multiple_columns_example()
Python

ポイント:

  • df["列名"] で1列、df[["列名1", "列名2"]] で複数列を選択できること。
  • 不要な列を捨てて、必要な列だけに絞ることで、処理対象をシンプルにできること。

行選択:特定の行・範囲を取り出す

行番号で選ぶ(iloc)

import pandas as pd


def select_rows_by_position():
    df = pd.read_csv("sales_day37.csv")

    print("=== 先頭3行(行番号で選択) ===")
    print(df.iloc[0:3])  # 0〜2行目


if __name__ == "__main__":
    select_rows_by_position()
Python

行ラベルで選ぶ(loc)

loc は「行ラベル」で選ぶためのものですが、 CSV読み込み直後は行ラベルが0,1,2,…なので、iloc と似た使い方になります。

import pandas as pd


def select_rows_by_label():
    df = pd.read_csv("sales_day37.csv")

    print("=== 行ラベル 2〜4 を選択 ===")
    print(df.loc[2:4])  # 2〜4行目


if __name__ == "__main__":
    select_rows_by_label()
Python

ポイント:

  • iloc は「位置(0から始まるインデックス)」で選ぶ。
  • loc は「ラベル」で選ぶが、初期状態ではラベル=インデックス番号になっていることが多い。

条件抽出:条件に合う行だけを絞り込む

店舗Aだけを抽出する

import pandas as pd


def filter_by_store():
    df = pd.read_csv("sales_day37.csv")

    # 店舗が "A" の行だけを抽出します。
    df_a = df[df["店舗"] == "A"]

    print("=== 店舗Aのデータ ===")
    print(df_a)


if __name__ == "__main__":
    filter_by_store()
Python

売上が1000以上の行だけを抽出する

欠損値や文字列が混ざっているときは、まず型を整える必要がありますが、 ここでは一旦「売上列が数値として読み込まれている」前提で説明します。

import pandas as pd


def filter_by_sales():
    df = pd.read_csv("sales_day37.csv")

    # 売上が1000以上の行だけを抽出します。
    df_high = df[df["売上"] >= 1000]

    print("=== 売上が1000以上のデータ ===")
    print(df_high)


if __name__ == "__main__":
    filter_by_sales()
Python

ポイント:

  • df[条件式] という形で、条件に合う行だけを抽出できること。
  • 条件式は「列に対する比較」を書く(例:df["売上"] >= 1000)。

ソート:並べ替えで「見やすさ」と「分析しやすさ」を上げる

売上の降順で並べ替える

import pandas as pd


def sort_by_sales():
    df = pd.read_csv("sales_day37.csv")

    # 売上列で降順(大きい順)に並べ替えます。
    df_sorted = df.sort_values(by="売上", ascending=False)

    print("=== 売上の降順でソートしたDataFrame ===")
    print(df_sorted)


if __name__ == "__main__":
    sort_by_sales()
Python

日付→店舗の複数キーでソートする

import pandas as pd


def sort_by_date_and_store():
    df = pd.read_csv("sales_day37.csv")

    # 日付昇順、店舗昇順で並べ替えます。
    df_sorted = df.sort_values(by=["日付", "店舗"], ascending=[True, True])

    print("=== 日付→店舗でソートしたDataFrame ===")
    print(df_sorted)


if __name__ == "__main__":
    sort_by_date_and_store()
Python

ポイント:

  • sort_values(by="列名") で特定列を基準に並べ替えできること。
  • by=["列1", "列2"] のように複数列を指定して、複数キーでソートできること。

欠損値:空欄やNaNをどう扱うか

欠損値の確認

import pandas as pd


def check_missing_values():
    df = pd.read_csv("sales_day37.csv")

    print("=== 欠損値の有無 ===")
    print(df.isna())  # True が欠損値

    print("\n=== 列ごとの欠損値数 ===")
    print(df.isna().sum())  # 列ごとの欠損数


if __name__ == "__main__":
    check_missing_values()
Python

欠損値を除外する(dropna)

import pandas as pd


def drop_missing_rows():
    df = pd.read_csv("sales_day37.csv")

    # 欠損値を含む行を丸ごと削除します。
    df_clean = df.dropna()

    print("=== 欠損値を含む行を削除したDataFrame ===")
    print(df_clean)


if __name__ == "__main__":
    drop_missing_rows()
Python

欠損値を埋める(fillna)

import pandas as pd


def fill_missing_values():
    df = pd.read_csv("sales_day37.csv")

    # 数量の欠損値を0で埋めます。
    df["数量"] = df["数量"].fillna(0)

    # 売上の欠損値を0で埋めます。
    df["売上"] = df["売上"].fillna(0)

    print("=== 欠損値を0で埋めたDataFrame ===")
    print(df)


if __name__ == "__main__":
    fill_missing_values()
Python

ポイント:

  • isna() で欠損値をTrue/Falseで確認できること。
  • dropna() で欠損値を含む行を削除できること。
  • fillna(値) で欠損値を特定の値で埋めることができること。

型変換:文字列の数値を「本物の数値」にする

数量列を数値に変換する(エラーはNaNに)

import pandas as pd


def convert_types():
    df = pd.read_csv("sales_day37.csv")

    print("=== 変換前の型 ===")
    print(df.dtypes)

    # 数量列を数値に変換します。変換できないものは NaN になります。
    df["数量"] = pd.to_numeric(df["数量"], errors="coerce")

    # 単価列も数値に変換します。
    df["単価"] = pd.to_numeric(df["単価"], errors="coerce")

    # 売上列も数値に変換します。
    df["売上"] = pd.to_numeric(df["売上"], errors="coerce")

    print("\n=== 変換後の型 ===")
    print(df.dtypes)

    print("\n=== 型変換後のDataFrame ===")
    print(df)


if __name__ == "__main__":
    convert_types()
Python

ここでのポイント:

  • pd.to_numeric(列, errors="coerce") で、数値に変換できない値を NaN にできること。
  • 文字列の数値(”10″ など)を「本物の数値」に変換することで、計算が可能になること。

型変換+欠損値処理+計算の流れをまとめる

「数量 × 単価 → 売上」を再計算する

import pandas as pd


def clean_and_recalculate():
    df = pd.read_csv("sales_day37.csv")

    # 型変換
    df["数量"] = pd.to_numeric(df["数量"], errors="coerce")
    df["単価"] = pd.to_numeric(df["単価"], errors="coerce")
    df["売上"] = pd.to_numeric(df["売上"], errors="coerce")

    # 欠損値を0で埋める(数量・単価)
    df["数量"] = df["数量"].fillna(0)
    df["単価"] = df["単価"].fillna(0)

    # 売上を再計算(数量 × 単価)
    df["売上"] = df["数量"] * df["単価"]

    print("=== 整形後のDataFrame(売上再計算済み) ===")
    print(df)


if __name__ == "__main__":
    clean_and_recalculate()
Python

ポイント:

  • 型変換 → 欠損値処理 → 計算、という順番が大事であること。
  • 「汚いデータ」を「計算可能なきれいなデータ」に変える流れを作っていること。

Day 37ミニテンプレート:pandasデータ加工まとめスクリプト

最後に、Day 37で扱った要素を一通り試せるテンプレートを示します。

# day37_pandas_processing.py
import pandas as pd


def load_data(filename="sales_day37.csv"):
    df = pd.read_csv(filename)
    print("=== 読み込んだDataFrame ===")
    print(df)
    return df


def process_data(df):
    # 型変換
    df["数量"] = pd.to_numeric(df["数量"], errors="coerce")
    df["単価"] = pd.to_numeric(df["単価"], errors="coerce")
    df["売上"] = pd.to_numeric(df["売上"], errors="coerce")

    # 欠損値処理
    df["数量"] = df["数量"].fillna(0)
    df["単価"] = df["単価"].fillna(0)
    df["売上"] = df["売上"].fillna(0)

    # 売上再計算
    df["売上"] = df["数量"] * df["単価"]

    # 条件抽出:売上が1000以上
    df_high = df[df["売上"] >= 1000]

    # ソート:売上降順
    df_sorted = df_high.sort_values(by="売上", ascending=False)

    print("=== 整形後のDataFrame ===")
    print(df)

    print("\n=== 売上1000以上(降順ソート) ===")
    print(df_sorted)

    return df_sorted


def main():
    df = load_data()
    process_data(df)


if __name__ == "__main__":
    main()
Python

Day 37のまとめ

Day 37では、pandasデータ加工として、

  • 列選択・行選択で「必要な部分だけ」を取り出す方法
  • 条件抽出で「店舗Aだけ」「売上1000以上だけ」といった絞り込みを行う方法
  • ソートで「売上の降順」「日付→店舗」のように並べ替える方法
  • 欠損値(NaN)を確認し、削除したり特定の値で埋めたりする方法
  • 型変換で、文字列の数値を「本物の数値」に変えて計算可能にする方法
  • 型変換+欠損値処理+再計算という、実務でよくある整形の流れ

をステップバイステップで体験していただきました。

ここまで来ると、pandasを使って 「現場から渡される少し汚れたデータ」を整えて、欲しい形に加工する という感覚がかなり育っているはずです。 次のステップでは、グループ化や集計など、さらに一歩進んだデータ分析・業務自動化に進んでいきます。

タイトルとURLをコピーしました