Python | ファイル・OS 操作:pandas.read_csv

Python Python
スポンサーリンク

概要(pandas.read_csvは「CSVをDataFrameに変換」する最短ルート)

pandas.read_csvは、CSV(テキスト表)を一発でDataFrameへ読み込む関数です。初心者がまず押さえるのは「ファイルパス」「文字コード(encoding)」「列名・型・欠損の扱い」。この3つを丁寧に決めるだけで、後工程(集計・可視化)がスムーズになります。大きなCSVでも、範囲指定・チャンク分割・型の事前指定で高速・省メモリに処理できます。


基本の使い方(ここが重要)

最短の読み込みと確認

import pandas as pd

df = pd.read_csv("data/users.csv", encoding="utf-8")
print(df.head())       # 先頭5行
print(df.shape)        # (行数, 列数)
print(df.columns)      # 列名一覧
Python

encodingは迷ったらutf-8。Excel出力などでBOM付きの可能性があるなら、utf-8-sigを使うと安全です。

ヘッダー行・列名・インデックスの制御

# ヘッダーあり(標準)
df = pd.read_csv("data.csv")

# ヘッダーなし → 列名を自分で付ける
df = pd.read_csv("noheader.csv", header=None, names=["name", "age", "city"])

# 1列を行インデックスにする
df = pd.read_csv("data.csv", index_col="id")
Python

header=Noneは「先頭行もデータ」であることを示し、namesで列名を付与します。index_colで行ラベルを指定すると、検索や結合で扱いやすくなります。

列選択と型指定(最初から“欲しい形”で読む)

# 必要な列だけ読む
df = pd.read_csv("sales.csv", usecols=["date", "item", "amount"])

# 列の型を明示(速く・安定して読める)
df = pd.read_csv("users.csv", dtype={"id": "int64", "age": "Int64"})  # Int64は欠損対応の整数
Python

型が曖昧だと自動推定で遅くなったり、意図しない型になります。dtypeで先に固定すると安定します。


欠損・日付・区切りなどの実務必須オプション(深掘り)

欠損値をNaNとして扱い、カスタム欠損も指定

df = pd.read_csv("data.csv", na_values=["", "NA", "null"])
print(df.isna().sum())  # 欠損の数を確認
Python

文字列の欠損コード(”NA”など)をna_valuesに並べると、適切にNaNへ変換されます。算術・統計関数がそのまま使えます。

日付列の自動変換(parse_dates)

df = pd.read_csv("sales.csv", parse_dates=["date"])
print(df["date"].dt.year)  # datetimeとして操作可能
Python

parse_datesを使うと、文字列ではなくdatetime64へ変換されます。複数列の結合日付(year, month, day)もリストで指定可能です。

区切り文字・引用符・小数点・千区切り

# セミコロン区切り、引用符、千区切り・小数点記号
df = pd.read_csv(
    "euro.csv",
    sep=";",
    quotechar='"',
    thousands=".",
    decimal=",",
)
Python

欧州のCSVなど、区切りや表記が違う場合はここを合わせると崩れません。

BOM付きや別エンコーディングへの対応

# BOM付き(Excel友好)
df = pd.read_csv("export.csv", encoding="utf-8-sig")

# Shift_JIS(Windows由来)
df = pd.read_csv("sjis.csv", encoding="cp932")
Python

文字化け時はencodingを切り替えます。日本語のWindows由来はcp932(Shift_JIS系)が定番です。


大きなCSVを速く・軽く読む(範囲絞り・チャンク・エンジン)

先頭・特定行だけ読む(skiprows, nrows)

# 先頭をスキップして少量サンプルだけ
df = pd.read_csv("huge.csv", skiprows=1_000, nrows=5_000)
Python

検証時はnrowsで小さく読み、設定が固まったら本番投入。余計な前置行(メタ情報)をskiprowsで飛ばせます。

チャンク単位で分割読み(chunksize)

for chunk in pd.read_csv("huge.csv", chunksize=100_000):
    # チャンクごとに処理(集計・書き出しなど)
    print(len(chunk))
Python

全件を一度にメモリへ載せず、流し込み処理にできます。集計は「チャンクごとに部分集計→最後に統合」が定石です。

型指定とエンジンで安定化・高速化

# 型を固定(自動推定のコスト削減)
df = pd.read_csv("logs.csv", dtype={"user_id": "int64", "score": "float64"})

# パーサエンジンの切り替え例(最新版では自動最適も進化)
df = pd.read_csv("data.csv", engine="python")  # 複雑な区切りに強いが遅め
Python

dtypeで推定コストを下げるのが最優先。複雑な区切り・改行がある場合はengine=”python”で通ることがあります。高速性は“範囲絞り・チャンク・型指定”で稼ぐのが基本です。


クリーニング・インデックス・Pathlib連携(安全運用の型)

余計な空白・文字の正規化を読み後すぐに

df = pd.read_csv("users.csv")
df["name"] = df["name"].str.strip()         # 前後空白除去
df["name"] = df["name"].str.replace("\u3000", " ")  # 全角スペースを半角へ
Python

文字列列はstrアクセサで整えます。早めに正規化しておくと下流が楽になります。

列からインデックスを作る(検索・結合を速く)

df = pd.read_csv("users.csv")
df = df.set_index("id", drop=False)  # idで検索・結合しやすい
Python

index_colで読み込み時に設定してもOK。結合(merge)時のキーに合わせて整えておきましょう。

Pathlibで安全なファイル操作を一緒に

from pathlib import Path
import pandas as pd

path = Path("data") / "sales.csv"
if not path.exists():
    raise FileNotFoundError(path)

df = pd.read_csv(path, encoding="utf-8")
Python

結合・存在確認・読み込みまで一貫して書けると、運用事故が減ります。


例題で身につける(定番から一歩先まで)

例題1:ヘッダーありCSVを型・欠損を指定して読み込む

import pandas as pd

df = pd.read_csv(
    "sales.csv",
    usecols=["date", "item", "amount"],
    dtype={"item": "string", "amount": "float64"},
    parse_dates=["date"],
    na_values=["", "NA", "null"]
)
print(df.dtypes)      # 型確認
print(df["amount"].sum())
Python

例題2:セミコロン区切り+欧州表記CSVの読込み

import pandas as pd

df = pd.read_csv(
    "euro_sales.csv",
    sep=";",
    decimal=",",
    thousands=".",
    encoding="utf-8"
)
print(df.head())
Python

例題3:巨大CSVをチャンクで部分集計して合算

import pandas as pd

total = 0.0
for chunk in pd.read_csv("huge.csv", usecols=["amount"], chunksize=200_000):
    total += chunk["amount"].sum()
print("total:", total)
Python

例題4:ヘッダー無しを列名付与して読み、インデックスを設定

import pandas as pd

df = pd.read_csv("noheader.csv", header=None, names=["id", "name", "score"])
df = df.set_index("id", drop=False)
print(df.loc[1001])   # idで検索
Python

まとめ

pandas.read_csvは「列名・型・欠損の扱い」を最初に決めるのが肝心です。usecolsで絞り、dtypeで型を固定、parse_datesで日付にする。文字コードはutf-8(必要ならutf-8-sigやcp932)、区切り・小数点・千区切りはCSVの仕様に合わせる。巨大ファイルはskiprows・nrows・chunksizeで“作らず流す”。Pathlibでファイル操作を安全に組み合わせ、読み込んだ直後に文字列正規化・インデックス整備を済ませれば、初心者でも短く、速く、壊れないデータ読込みが実現できます。

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