データ分析の実務において、CSV(カンマ区切り)やTSV(タブ区切り)形式のテキストファイルはデータの交換フォーマットとして最も広く利用されています。Pandasには、これらのファイルを非常に簡単な記述でDataFrameとして読み込み、またDataFrameをファイルとして保存する機能が備わっています。
本記事では、read_csv 関数による柔軟なデータの読み込み方法と、to_csv メソッドによるファイル出力の制御について、具体的なコードを交えて解説します。
目次
CSV・TSVファイルの読み込み (read_csv)
Pandasの pd.read_csv() は、ローカルファイルやURLからデータを読み込むための関数です。デフォルトではカンマ区切りのファイルを想定していますが、引数を変更することでタブ区切り(TSV)やヘッダーのないファイルにも対応可能です。
主要な引数
filepath_or_buffer: ファイルパスまたはURL。sep: 区切り文字。デフォルトはカンマ,。TSVの場合は\tを指定します。header: ヘッダー行の位置。ヘッダーがない場合はNoneを指定します。dtype: 列ごとのデータ型を辞書で指定します。メモリの節約や型の誤認を防ぐために有効です。
CSV・TSVファイルへの書き込み (to_csv)
DataFrameの内容をファイルに保存するには df.to_csv() メソッドを使用します。
主要な引数
path_or_buf: 出力先のファイルパス。index: 行ラベル(インデックス)をファイルに出力するかどうか。Falseにするとインデックス列が削除されます。sep: 区切り文字。index_label: インデックスを出力する場合の列名を指定します。
実装サンプルコード
以下のコードでは、まず動作確認用のダミーCSVファイルを作成し、それを様々な設定で読み込む手順を示します。その後、加工したデータを別の形式でファイルに出力します。
ここでは、あるシステムの「ユーザーアクセスログ」を題材としています。
import pandas as pd
import numpy as np
import os
def process_log_data():
"""
CSV/TSVファイルの読み書き(入出力)を実演する関数
"""
# ---------------------------------------------------------
# 1. 準備: 動作確認用のサンプルファイルを作成
# ---------------------------------------------------------
csv_filename = "sample_access_log.csv"
tsv_filename = "sample_no_header.tsv"
# 標準的なCSVデータ(ヘッダーあり)
csv_content = """user_id,access_time,response_time
1001,2026-05-01 10:00:00,0.45
1002,2026-05-01 10:05:00,1.20
1003,2026-05-01 10:10:00,0.08"""
# TSVデータ(ヘッダーなし、タブ区切り)
tsv_content = "2001\tLogin_Success\n2002\tLogin_Failed\n2003\tLogout"
with open(csv_filename, "w", encoding="utf-8") as f:
f.write(csv_content)
with open(tsv_filename, "w", encoding="utf-8") as f:
f.write(tsv_content)
print(f"--- 準備完了: {csv_filename}, {tsv_filename} を作成しました ---\n")
# ---------------------------------------------------------
# 2. ファイルの読み込み (read_csv)
# ---------------------------------------------------------
print("=== CSVファイルの読み込み ===")
# 基本的な読み込み(型指定あり)
# user_idは整数、response_timeは浮動小数点数として読み込む
df_csv = pd.read_csv(
csv_filename,
dtype={
"user_id": np.int64,
"response_time": np.float64
}
)
print(df_csv)
print(f"dtypes:\n{df_csv.dtypes}\n")
print("=== TSVファイルの読み込み(ヘッダーなし) ===")
# sep="\t" でタブ区切りを指定
# header=None でヘッダー行がないことを明示
# names引数で列名を後付けで付与
df_tsv = pd.read_csv(
tsv_filename,
sep="\t",
header=None,
names=["session_id", "action_type"]
)
print(df_tsv)
print("\n")
# ---------------------------------------------------------
# 3. ファイルへの書き込み (to_csv)
# ---------------------------------------------------------
print("=== CSVファイルへの出力 ===")
output_csv = "processed_log.csv"
# index=False にすることで、Pandasの行番号(0, 1, 2...)を出力しない
df_csv.to_csv(output_csv, index=False)
print(f"保存完了: {output_csv} (インデックスなし)")
print("=== TSVファイルへの出力 ===")
output_tsv = "processed_log.tsv"
# sep="\t" でTSV形式として保存
# index=True でインデックスも保存し、index_labelでその列名を設定
df_tsv.to_csv(
output_tsv,
sep="\t",
index=True,
index_label="row_number"
)
print(f"保存完了: {output_tsv} (インデックスあり, ラベル='row_number')")
# (参考) 作成したファイルを削除する場合は以下を有効化してください
# os.remove(csv_filename)
# os.remove(tsv_filename)
# os.remove(output_csv)
# os.remove(output_tsv)
if __name__ == "__main__":
process_log_data()
実行結果
--- 準備完了: sample_access_log.csv, sample_no_header.tsv を作成しました ---
=== CSVファイルの読み込み ===
user_id access_time response_time
0 1001 2026-05-01 10:00:00 0.45
1 1002 2026-05-01 10:05:00 1.20
2 1003 2026-05-01 10:10:00 0.08
dtypes:
user_id int64
access_time object
response_time float64
dtype: object
=== TSVファイルの読み込み(ヘッダーなし) ===
session_id action_type
0 2001 Login_Success
1 2002 Login_Failed
2 2003 Logout
=== CSVファイルへの出力 ===
保存完了: processed_log.csv (インデックスなし)
=== TSVファイルへの出力 ===
保存完了: processed_log.tsv (インデックスあり, ラベル='row_number')
注意点と補足
- 区切り文字: CSV以外(タブやパイプ
|など)を扱う場合は必ずsep引数を指定してください。 - インデックスの出力:
to_csvのデフォルトはindex=Trueです。不要な行番号が保存されるのを防ぐため、一般的なデータ保存ではindex=Falseを指定することが推奨されます。 - エンコーディング: 日本語を含むファイルを扱う場合、Windows環境などでは
encoding="utf-8"やencoding="cp932"(Shift-JIS) を明示的に指定する必要がある場合があります(例:pd.read_csv("file.csv", encoding="utf-8"))。
