PandasでDataFrameをCSVに書き出し・追記!to_csv()徹底活用ガイド ✍️
データ分析の最終段階や中間保存として、PandasのDataFrameをCSVファイルに出力する作業は頻繁に行われます。また、既存のCSVファイルにデータを追記したいケースもあるでしょう。Pandasのto_csv()メソッドは、これらのニーズに応える強力な機能を提供します。
この記事では、DataFrameをCSVファイルに書き出す基本的な方法から、ヘッダーの有無、インデックスの扱い、そして既存ファイルへの追記といった応用的な使い方まで、to_csv()の活用方法を詳しく解説します。
to_csv()の基本:DataFrameをファイルに保存 💾
to_csv()メソッドは、DataFrameの内容を指定したファイルパスにCSV形式で出力します。
最もシンプルな書き出し方
ファイルパスを指定するだけで、DataFrameがCSVファイルとして保存されます。
import pandas as pd
import os # ファイル操作用
# サンプルDataFrameを作成
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120],
'在庫数': [50, 120, 30]
})
# CSVファイルとして書き出し
output_file = 'products.csv'
df.to_csv(output_file)
print(f"'{output_file}' にDataFrameを書き出しました。")
# 作成されたファイルの内容を確認 (オプション)
# with open(output_file, 'r', encoding='utf-8') as f:
# print("\n--- ファイル内容 ---")
# print(f.read())
# 不要なファイルを削除
# os.remove(output_file)
この時、デフォルトでは行インデックスと列ヘッダーも一緒に出力されます。
to_csv()の便利なオプション 🛠️
to_csv()には、出力形式を細かく制御するための様々なオプションがあります。
1. index:行インデックスの書き出し制御
デフォルトでは行インデックスも出力されますが、不要な場合はindex=Falseを指定します。
import pandas as pd
import os
df = pd.DataFrame({
'商品名': ['りんご', 'みかん'],
'価格': [100, 80]
})
output_file_no_index = 'products_no_index.csv'
df.to_csv(output_file_no_index, index=False)
print(f"'{output_file_no_index}' にインデックスなしで書き出しました。")
2. header:列ヘッダーの書き出し制御
ヘッダー行を出力したくない場合はheader=Falseを指定します。
import pandas as pd
import os
df = pd.DataFrame({
'商品名': ['りんご', 'みかん']
})
output_file_no_header = 'products_no_header.csv'
df.to_csv(output_file_no_header, header=False, index=False) # インデックスも不要な場合
print(f"'{output_file_no_header}' にヘッダーなしで書き出しました。")
3. sep:区切り文字の指定
デフォルトではカンマ区切りですが、タブ区切り(TSV)やその他の区切り文字で出力したい場合にsepを指定します。
import pandas as pd
import os
df = pd.DataFrame({
'ID': [1, 2],
'データ': ['A', 'B']
})
# タブ区切りで出力 (TSVファイル)
output_file_tsv = 'data.tsv'
df.to_csv(output_file_tsv, sep='\t', index=False)
print(f"'{output_file_tsv}' にタブ区切りで書き出しました。")
4. encoding:文字コードの指定
日本語の文字を含むDataFrameを保存する際、文字化けを防ぐために適切な文字コード(例: 'shift_jis', 'utf-8')を指定します。
import pandas as pd
import os
df_jp = pd.DataFrame({
'地域': ['東京', '大阪'],
'人口': [1400, 900]
})
output_file_utf8 = 'population_utf8.csv'
df_jp.to_csv(output_file_utf8, encoding='utf-8', index=False)
print(f"'{output_file_utf8}' にUTF-8で書き出しました。")
# 例: Shift_JISで書き出す場合
# output_file_sjis = 'population_sjis.csv'
# df_jp.to_csv(output_file_sjis, encoding='shift_jis', index=False)
# print(f"'{output_file_sjis}' にShift_JISで書き出しました。")
5. na_rep:欠損値(NaN)の置換
DataFrameに欠損値(NaN)が含まれる場合、CSVファイル上での表現を指定できます。
import pandas as pd
import numpy as np
import os
df_na = pd.DataFrame({
'A': [1, 2, np.nan],
'B': [4, np.nan, 6]
})
output_file_na = 'data_with_na.csv'
df_na.to_csv(output_file_na, na_rep='N/A', index=False)
print(f"'{output_file_na}' のNaNを'N/A'に置き換えて書き出しました。")
既存のCSVファイルにデータを追記する (mode='a') ✍️
to_csv()のmodeオプションを使うことで、既存のファイルにデータを追記することができます。これは、ログデータなどを継続的に保存したい場合に非常に便利です。
mode='a' と header=False の組み合わせ
ファイルを追記モード('a' for append)で開くと同時に、通常はヘッダーを書き出さないようにheader=Falseを指定します。これにより、元のファイルのヘッダー行が重複するのを防げます。
import pandas as pd
import os
# 最初にCSVファイルを作成
initial_df = pd.DataFrame({'日付': ['2023-01-01'], '売上': [1000]})
existing_file = 'daily_sales.csv'
initial_df.to_csv(existing_file, index=False)
print(f"'{existing_file}' を初期データで作成しました。")
# 追記するデータ
new_df = pd.DataFrame({'日付': ['2023-01-02'], '売上': [1200]})
# 既存ファイルにデータを追記 (ヘッダーなし、インデックスなし)
new_df.to_csv(existing_file, mode='a', header=False, index=False)
print(f"'{existing_file}' に新しいデータを追記しました。")
# 追記後のファイル内容を確認
# with open(existing_file, 'r', encoding='utf-8') as f:
# print("\n--- 追記後のファイル内容 ---")
# print(f.read())
# 不要なファイルを削除
# os.remove(existing_file)
注意点: 追記モードの場合、列の順序や数が既存ファイルと異なる場合、CSVファイルとして正しく機能しなくなる可能性があります。追記するDataFrameは、既存のファイルの列構造と一致させるようにしましょう。
まとめ
Pandasのto_csv()メソッドは、DataFrameをCSVファイルとして出力するための非常に柔軟なツールです。
-
基本的な書き出し:
df.to_csv('filename.csv') -
インデックスを省略:
index=False -
ヘッダーを省略:
header=False -
区切り文字を指定:
sep='\t'(TSVの場合) -
文字コードを指定:
encoding='utf-8'など -
既存ファイルに追記:
mode='a'とheader=Falseを組み合わせる
これらのオプションを使いこなすことで、あなたのデータ出力ニーズに合わせて、CSVファイルを自由自在にコントロールできるでしょう。ぜひto_csv()をマスターして、データ分析ワークフローをさらに効率化してください!

