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ファイルとして保存されます。

Python
 
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を指定します。

Python
 
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を指定します。

Python
 
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を指定します。

Python
 
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')を指定します。

Python
 
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ファイル上での表現を指定できます。

Python
 
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を指定します。これにより、元のファイルのヘッダー行が重複するのを防げます。

Python
 
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()をマスターして、データ分析ワークフローをさらに効率化してください!