Pandas データの読み書き

Pandas はさまざまなデータ形式を読み書きするための豊富な関数を提供しています。一般的な CSV や Excel に加えて、SQL データベース、HTML テーブル、Parquet などの形式もサポートしています。このセクションでは、これらの追加の I/O 機能を紹介し、さまざまなシナリオでデータのインポート・エクスポートを柔軟に処理できるようにします。


主要なI/O関数の概要

Pandas の I/O 機能は非常に強力で、さまざまなデータ形式の読み書き操作をサポートしています。以下はよく使われる読み取り関数と書き込み関数です。

読み取り関数 書き込み関数 サポート形式 代表的なシナリオ
pd.read_csv() to_csv() CSV、TSV ログファイル、テーブルデータ
pd.read_excel() to_excel() Excel(.xlsx, .xls) 業務レポート、財務データ
pd.read_sql() to_sql() SQL データベース 企業データベースとの連携
pd.read_html() - HTML テーブル Web ページのデータ取得
pd.read_parquet() to_parquet() Apache Parquet ビッグデータ分析、ストレージ
pd.read_feather() to_feather() Feather 形式 高速読み書き、インメモリデータ
pd.read_json() to_json() JSON API データ、Web サービス
pd.read_pickle() to_pickle() Python pickle Python オブジェクトのシリアライズ

形式によって適用シナリオが異なります。CSV は汎用形式ですがファイルサイズが大きくなります。Parquet は列指向ストレージで、ビッグデータ分析に適しています。Excel は人が閲覧するのに適していますが、大規模データには適していません。


CSV とテキストファイル

CSV(Comma-Separated Values)は最も一般的なデータ交換形式であり、Pandas のサポートも最も充実しています。

よく使う読み取りパラメータ

例

import pandas as pd

# 最も基本的な読み取り
df = pd.read_csv("data.csv")

# 区切り文字を指定(CSV はデフォルトでカンマ、TSV はタブ)
df_tsv = pd.read_csv("data.tsv", sep="\t")

# エンコーディングを指定(中国語ファイルの処理でよく使用)
df_utf8 = pd.read_csv("data.csv", encoding="utf-8")
df_gbk = pd.read_csv("data.csv", encoding="gbk")

# 行をスキップ(ヘッダー後の行やコメント行をスキップ)
df = pd.read_csv("data.csv", skiprows=3)  # 最初の3行をスキップ
df = pd.read_csv("data.csv", skiprows=[2, 4])  # 2行目と4行目をスキップ

# ヘッダー行を使用(デフォルトは最初の行)
df = pd.read_csv("data.csv", header=0)  # 0行目をヘッダーとして使用
df = pd.read_csv("data.csv", header=None)  # ヘッダーを使用せず、0,1,2... を自動生成

# 列名を指定
df = pd.read_csv("data.csv", names=["ID", "姓名", "年龄", "城市"])

# インデックス列を指定
df = pd.read_csv("data.csv", index_col=0)  # 0列目をインデックスとして使用
df = pd.read_csv("data.csv", index_col=["姓名"])  # 複数列を複合インデックスとして使用

欠損値の処理

例

import pandas as pd
import numpy as np

# どの値を欠損値として扱うかを指定
df = pd.read_csv(
    "data.csv",
    na_values=["NA", "null", "NULL", "N/A", "", " "]  # これらの値はすべて NaN として認識されます
)

# 列ごとに異なる欠損値マーカーを使用できます
df = pd.read_csv(
    "data.csv",
    na_values={
        "年龄": ["未知", "0"],  # "年龄"列の欠損値
        "城市": ["未知"]        # "城市"列の欠損値
    }
)

# 一部の値を正常値として保持(欠損値として認識しない)
df = pd.read_csv("data.csv", keep_default_na=False)

CSV ファイルへの書き込み

例

import pandas as pd

# テストデータを準備
df = pd.DataFrame({
    "姓名": ["张三", "李四", "王五"],
    "年龄": [25, 30, 28],
    "城市": ["北京", "上海", "广州"]
})

# CSV に書き込み(デフォルトではインデックスあり)
df.to_csv("output.csv")

# インデックスを書き込まない
df.to_csv("output.csv", index=False)

# 区切り文字を指定
df.to_csv("output.csv", sep="\t")

# ヘッダーを書き込まない
df.to_csv("output.csv", header=False)

# エンコーディングを指定
df.to_csv("output.csv", encoding="utf-8-sig")  # BOM 付き、Excel で開くのに適しています

JSON ファイル

JSON(JavaScript Object Notation)は Web アプリケーションで最も一般的なデータ形式であり、Pandas は柔軟な読み書き機能を提供します。

JSON の構造と読み取り方法

JSON データ構造にはさまざまな形式があります。読み取り時には実際の構造に応じて適切なパラメータを選択する必要があります。

例

import pandas as pd
import json

# テスト用 JSON データを準備
data_records = '''
[
{"name": "张三", "age": 25, "city": "北京"},
{"name": "李四", "age": 30, "city": "上海"},
{"name": "王五", "age": 28, "city": "广州"}
]
'''


# 方法1:JSON 配列(各行が1つのオブジェクト)-> DataFrame
df = pd.read_json(data_records, orient="records")
print("orient='records':")
print(df)
print()

# 方法2:JSON オブジェクト(キーと値のペア)-> Series
data_dict = '{"name": "张三", "age": 25, "city": "北京"}'
s = pd.read_json(data_dict, typ="series")
print("Series として読み取り:")
print(s)

JSON Lines 形式

JSON Lines(.jsonl)は、各行が完全な JSON オブジェクトである形式で、ログやビッグデータのシナリオでよく使用されます。

例

import pandas as pd

# JSON Lines 形式のデータ
jsonl_data = '''{"name": "张三", "age": 25}
{"name": "李四", "age": 30}
{"name": "王五", "age": 28}
{"name": "赵六", "age": 35}
'''


# JSON Lines ファイルに書き込み
with open("data.jsonl", "w", encoding="utf-8") as f:
    f.write(jsonl_data)

# JSON Lines を読み取り(各行が JSON オブジェクト)
df = pd.read_json("data.jsonl", lines=True)
print(df)

JSON への書き込み

例

import pandas as pd

df = pd.DataFrame({
    "姓名": ["张三", "李四", "王五"],
    "年龄": [25, 30, 28],
    "城市": ["北京", "上海", "广州"]
})

# 異なる orient の JSON を書き込み
df.to_json("output_records.json", orient="records", force_ascii=False, indent=2)
df.to_json("output_index.json", orient="index", force_ascii=False, indent=2)
df.to_json("output_columns.json", orient="columns", force_ascii=False, indent=2)

# JSON Lines 形式
df.to_json("output.jsonl", orient="records", lines=True, force_ascii=False)

Pickle シリアライズ

Pickle は Python ネイティブのオブジェクトシリアライズ形式で、DataFrame や複雑な入れ子構造を含むあらゆる Python オブジェクトを保存できます。

例

import pandas as pd
import pickle

# 複雑な構造の DataFrame を作成
df = pd.DataFrame({
    "A": range(10),
    "B": range(10, 20),
    "C": ["foo", "bar"] * 5
})

# Pickle ファイルに書き込み
df.to_pickle("data.pkl")

# Pickle ファイルを読み取り
df_loaded = pd.read_pickle("data.pkl")
print(df_loaded)

# 圧縮して書き込み(gzip 圧縮でファイルサイズを縮小)
df.to_pickle("data.pkl.gz", compression="gzip")
df_loaded = pd.read_pickle("data.pkl.gz", compression="gzip")

Pickle 形式は Python でのみ読み取ることができ、言語をまたいだデータ交換には適していません。また、信頼できないソースから Pickle ファイルを読み込むとセキュリティリスクがあります。出所不明の .pkl ファイルは読み込まないでください。


パフォーマンスとシナリオの選択

データ形式によってパフォーマンス特性が異なります。適切な形式を選択することで効率を大幅に向上できます。

形式 読み取り速度 書き込み速度 ファイルサイズ 適用シナリオ
CSV 慢 中 大 汎用交換形式、人間が読み取り可能
Parquet 非常に速い 快 非常に小さい ビッグデータ分析、列指向クエリ
Feather 極めて速い 極めて速い 大 インメモリデータの高速受け渡し
Pickle 快 快 中 Python オブジェクトの永続化
JSON 慢 中 非常に大きい Web API、言語横断

よくある問題と注意事項

1、大きなファイル読み取り時のメモリ不足

超大な CSV または JSON ファイルの場合は、chunksizeパラメータを使用してチャンク単位で読み取り、一度にメモリへ読み込むことを避けます。

2、中国語のエンコーディング問題

中国語ファイルを処理する際は、正しいエンコーディングを指定してください。一般的なエンコーディングには、utf-8、gbk、gb2312、utf-8-sig(BOM)などがあります。

3、書き込み後にファイルが破損する

重要なデータを書き込む前に、まず読み取って検証することをお勧めします。大きなファイルを書き込む際に圧縮形式を使用すると、ディスクIOを削減し、データ破損のリスクを低減できます。

4、Excel形式の制限

Excel 2003版(.xls)の単一シートは最大65536行、2007版(.xlsx)は最大1048576行です。制限を超える場合は、他の形式を検討してください。

その他の拡張子