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 のサポートも最も充実しています。
よく使う読み取りパラメータ
例
# 最も基本的な読み取り
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 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 ファイルへの書き込み
例
# テストデータを準備
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 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 オブジェクトである形式で、ログやビッグデータのシナリオでよく使用されます。
例
# 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 への書き込み
例
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 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行です。制限を超える場合は、他の形式を検討してください。
その他の拡張子