🐍

(学習ログ)Python014:pandasによるデータの読み込みと前処理

に公開

1. はじめに

この記事の目的

この記事では、pandasを使った基本的なデータの読み込みと前処理の方法を学びます。

この記事の概要

  • CSVファイルとExcelファイルの読み込み
  • 日付データの変換と月次データの抽出
  • 文字列データの正規化(大文字変換・スペース削除)
  • データの並び替えとユニーク値の確認

2. サンプルコード

コード全文

import pandas as pd

# CSVファイルから売上データを読み込む
sample_uriage_data = pd.read_csv("002_サンプル/sample_uriage_data.csv")

# Excelファイルから顧客台帳を読み込む
sample_customer_ledger = pd.read_excel("002_サンプル/sample_customer_ledger.xlsx")

# purchase_date列を日付型に変換
sample_uriage_data["purchase_date"] = pd.to_datetime(sample_uriage_data["purchase_date"])

# 日付から年月(YYYYMM形式)を抽出して新しい列を作成
sample_uriage_data["purchase_month"] = sample_uriage_data["purchase_date"].dt.strftime("%Y%m")

# 商品名を全て大文字に変換
sample_uriage_data["item_name"] = sample_uriage_data["item_name"].str.upper()

# 商品名から全角スペースを削除
sample_uriage_data["item_name"] = sample_uriage_data["item_name"].str.replace(" ", "")

# 商品名から半角スペースを削除
sample_uriage_data["item_name"] = sample_uriage_data["item_name"].str.replace(" ","")

# 商品名で昇順にソート
sample_uriage_data.sort_values(by=["item_name"], ascending=True)

# ユニークな商品名の一覧を表示
print(pd.unique(sample_uriage_data["item_name"]))

# ユニークな商品名の件数を表示
print(len(pd.unique(sample_uriage_data["item_name"])))

コード解説

データの読み込み部分

sample_uriage_data = pd.read_csv("002_サンプル/sample_uriage_data.csv")
sample_customer_ledger = pd.read_excel("002_サンプル/sample_customer_ledger.xlsx")
  • pd.read_csv()でCSVファイルを、pd.read_excel()でExcelファイルをDataFrame形式で読み込みます
  • ファイルパスは相対パスで指定しています

日付データの処理

sample_uriage_data["purchase_date"] = pd.to_datetime(sample_uriage_data["purchase_date"])
sample_uriage_data["purchase_month"] = sample_uriage_data["purchase_date"].dt.strftime("%Y%m")
  • pd.to_datetime()で文字列を日付型に変換します
  • .dt.strftime("%Y%m")で「2024年1月」を「202401」のような年月形式に変換し、月次集計に利用できるようにします

文字列の正規化

sample_uriage_data["item_name"] = sample_uriage_data["item_name"].str.upper()
sample_uriage_data["item_name"] = sample_uriage_data["item_name"].str.replace(" ", "")
sample_uriage_data["item_name"] = sample_uriage_data["item_name"].str.replace(" ","")
  • .str.upper()で商品名を全て大文字に統一します(「Coffee」と「COFFEE」を同じものとして扱うため)
  • .str.replace()で全角・半角スペースを削除します(表記揺れを防ぐため)

並び替えとユニーク値の確認

sample_uriage_data.sort_values(by=["item_name"], ascending=True)
print(pd.unique(sample_uriage_data["item_name"]))
print(len(pd.unique(sample_uriage_data["item_name"])))
  • sort_values()で商品名をアルファベット順に並び替えます
  • pd.unique()でユニークな商品名の一覧を取得します
  • len()でユニークな商品名が何種類あるかをカウントします

実行結果例

# ユニークな商品名の一覧
['COFFEE' 'GREENTEAPOWDER' 'LATTE' 'MILKTEA' 'ORANGEJUICE']

# ユニークな商品名の件数
5

この結果から、売上データには5種類の商品が含まれていることが分かります。スペースが削除され、全て大文字に統一されているため、「Coffee」「COFFEE」「coffee 」のような表記揺れがあっても、全て「COFFEE」として認識されています。

3. エラーと確認のポイント

代表的なエラー文

ファイルが見つからない場合

FileNotFoundError: [Errno 2] No such file or directory: '002_サンプル/sample_uriage_data.csv'
  • 原因: ファイルパスが間違っているか、ファイルが存在しません
  • 対処法: カレントディレクトリを確認し、正しいパスを指定してください

日付変換でエラーが出る場合

ParserError: Unknown string format
  • 原因: 日付列に変換できない値(空白や文字列)が含まれています
  • 対処法: pd.to_datetime()errors='coerce'オプションを追加して、変換できない値をNaTにします

列名が存在しない場合

KeyError: 'purchase_date'
  • 原因: 指定した列名がDataFrameに存在しません
  • 対処法: df.columnsで列名を確認してください

よく使う確認メソッドと出力例

データの形状を確認

print(sample_uriage_data.shape)
# (100, 5)  # 100行5列のデータ

列名を確認

print(sample_uriage_data.columns)
# Index(['purchase_date', 'customer_id', 'item_name', 'quantity', 'price'], dtype='object')

最初の数行を表示

print(sample_uriage_data.head(3))
#   purchase_date  customer_id      item_name  quantity  price
# 0    2024-01-15           C1         COFFEE         2    500
# 1    2024-01-16           C2          LATTE         1    600
# 2    2024-01-17           C3  ORANGEJUICE         3    400

データ型を確認

print(sample_uriage_data.dtypes)
# purchase_date    datetime64[ns]
# customer_id              object
# item_name                object
# quantity                  int64
# price                     int64
# dtype: object

欠損値の確認

print(sample_uriage_data.isnull().sum())
# purchase_date    0
# customer_id      0
# item_name        2
# quantity         0
# price            0
# dtype: int64

4. まとめ

本記事で理解できるようになったこと:

  • 複数形式のファイル読み込み: read_csv()read_excel()を使い分けて、異なるファイル形式のデータを読み込める
  • 日付データの加工: pd.to_datetime()dt.strftime()を組み合わせて、日付から年月情報を抽出し、月次集計の準備ができる
  • 文字列の正規化手法: 大文字変換とスペース削除により、表記揺れを防ぎ、データの一貫性を保つことができる

Discussion