ITや趣味など気軽に投稿しています。

【Pandas】データフレームをCSVファイルとして書き出す

今回は、PandasデータフレームをCSVファイルとして書き出す方法を紹介します。

Pandasバージョン

本記事は、Pandas2.2.3の情報を基に執筆しています。

import pandas as pd
print(pd.__version__)

>>
2.2.3

pd.to_csv()

Excelの出力にはpd.to_csv()を用います。必須の引数として、出力するファイルのパスを拡張子付きで指定します。相対パスでも絶対パスでも問題ありません。

DataFrame.to_csv(path_or_buf=None*sep=’,’na_rep=”float_format=Nonecolumns=Noneheader=Trueindex=Trueindex_label=Nonemode=’w’encoding=Nonecompression=’infer’quoting=Nonequotechar='”‘lineterminator=Nonechunksize=Nonedate_format=Nonedoublequote=Trueescapechar=Nonedecimal=’.’errors=’strict’storage_options=None)

以下のような形式で指定します。

df.to_csv('output/out.csv') 

引数

引数必須説明
path_or_buf出力するファイルのパスまたはfile-likeのオブジェクト。指定しない場合、結果が文字列として返される。
sep出力するファイルの区切り文字を1文字で指定する。
デフォルトはカンマ(,)。
na_rep欠損値の表現。デフォルトは”。
float_format出力するfloat型のフォーマットを指定する。
columns出力するカラムをリスト形式で指定する。
headerFalseとした場合、ヘッダーを出力しない。
列名をリストで指定した場合、その列名をヘッダーとして出力される。
indexFalseとすると、インデックス(行名)を出力しない。
デフォルトはTrue。
index_labelインデックス列の列名をStringで指定する。
modeファイルを開く際のモードを指定する。‘w’, ‘x’, ‘a’から指定可能。
encoding出力するファイルの文字コードを指定する。
compression 出力するファイルを圧縮ファイル(zip, tarなど)として出力する際に指定する。
quoting出力ファイルの引用符の取扱いを指定する。
デフォルトはcsv.QUOTE_MINIMAL。
quotechar出力ファイルの引用符として使用する文字を指定する。
デフォルトはダブルクォート(”)。
lineterminator行末を表す文字(1文字)を指定する。
chunksize一度に出力する行数を指定する。ループ処理と併用する。
date_format日付型データのフォーマットを指定する。
doublequotequotecharで指定した文字が値に含まれる場合の処理を指定する。
escapecharsep及びquotecharで指定した文字をエスケープする際に用いる文字(1文字)を指定する。
decimal小数点として用いる文字(1文字)を指定する。
デフォルトはピリオド(.)。
errorsファイル作成時のエラーハンドリング。Python標準のopen()に準拠。
storage_optionsS3などリモートのファイルへのアクセスに必要な情報を辞書形式で指定する。

ここからは、よく使う引数をいくつか紹介しよう。

基本引数

以下のようなデータフレームを用意し、出力を検証します。

import pandas as pd
df = pd.DataFrame({'name': ['Raphael', 'Donatello'],
                   'mask': ['red', None],
                   'number': [55110.0001, 12345.6789]})

path_or_buf

ファイル名を指定することで、データフレームをCSVファイルとして出力します。パスを指定する際、出力先のフォルダが存在しない場合はエラーとなります。

事前にフォルダの存在チェックといったエラーハンドリングを推奨します。

df.to_csv('output/out.csv')

StringIOといったバッファに出力することも可能です。

本記事の検証では、出力の確認をプログラムで行うため、バッファに出力する形式をとります。

import io
buffer = io.StringIO()
df.to_csv(buffer, index=False)
print(buffer.getvalue()) 

>>
name,mask,number
Raphael,red,55110.0001
Donatello,,12345.6789

出力先を指定しない場合、文字列が返されます。

df.to_csv(index=False)

>>
'name,mask,number\r\nRaphael,red,55110.0001\r\nDonatello,,12345.6789\r\n'

sep

値の区切り文字を指定します。デフォルトはダブルクォート(”)です。

以下は、区切り文字をセミコロン(;)に指定した例です。

buffer = io.StringIO()
df.to_csv('output/out.csv', sep=";")
print(buffer.getvalue())

>>
;name;mask;number
0;Raphael;red;55110.0001
1;Donatello;;12345.6789

na_rep

欠損値データ(NoneやNA/NANなど)の表現を指定します。デフォルトはブランクとして出力されます。

以下では、欠損値データを”欠損値”という値で出力します。

buffer = io.StringIO()
df.to_csv(buffer, na_rep="欠損値")
print(buffer.getvalue()) 

>>
,name,mask,number
0,Raphael,red,55110.0001
1,Donatello,欠損値,12345.6789

float_format

小数点の表記を指定します。例えば小数第2位まで出力する場合は”%.2f”を指定します。

buffer = io.StringIO()
df.to_csv(buffer, float_format="%.2f")
print(buffer.getvalue())

>>
,name,mask,number
0,Raphael,red,55110.00
1,Donatello,,12345.68

columns

出力対象のカラムをカラム名のリスト形式で指定します。

buffer = io.StringIO()
df.to_csv(buffer, columns=["name", "number"])
print(buffer.getvalue())

>>
,name,number
0,Raphael,55110.0001
1,Donatello,12345.6789

header

ヘッダーの出力有無を指定します。デフォルトはTrueです。

buffer = io.StringIO()
df.to_csv(buffer, header=False)
print(buffer.getvalue())

>>
0,Raphael,red,55110.0001
1,Donatello,,12345.6789

また、カラム名のリストを指定することで、指定したカラム名で出力することができます。

buffer = io.StringIO()
df.to_csv(buffer, header=["名前", "マスク", "番号"])
print(buffer.getvalue())

>>
,名前,マスク,番号
0,Raphael,red,55110.0001
1,Donatello,,12345.6789

index

インデックス列の出力有無を指定します。デフォルトはTrueです。

buffer = io.StringIO()
df.to_csv(buffer, index=False)
print(buffer.getvalue())

>>
name,mask,number
Raphael,red,55110.0001
Donatello,,12345.6789

index_label

インデックス列のカラム名として出力する値を指定します。この、index及びheaderがともにFalseでないことが条件です。

buffer = io.StringIO()
df.to_csv(buffer, index_label="インデックス")
print(buffer.getvalue())

>>
インデックス,name,mask,number
0,Raphael,red,55110.0001
1,Donatello,,12345.6789

マルチインデックスの場合は、リスト形式で指定することも可能です。CSV上では、インデックスか通常のカラムかといった見分けはつきません。

# nameもインデックスとして追加(マルチインデックス化)
df = df.set_index('name', append=True)

buffer = io.StringIO()
df.to_csv(buffer, index_label=["インデックス", "インデックス2"])
print(buffer.getvalue())

>>
インデックス,インデックス2,mask,number
0,Raphael,red,55110.0001
1,Donatello,,12345.6789

また、index_label=Falseとすると、インデックス列のカラム名が出力されなくなります(インデックスの値は出力される)。

以下ではname列をインデックスに加えた状態でindex_label=Falseを指定しています。ヘッダー行のみ出力されなくなっています。

# nameもインデックスとして追加(マルチインデックス化)
df = df.set_index('name', append=True)

buffer = io.StringIO()
df.to_csv(buffer, index_label=False)
print(buffer.getvalue())

>>
mask,number
0,Raphael,red,55110.0001
1,Donatello,,12345.6789

mode

ファイルを開く際のモードを指定します。‘w’, ‘x’, ‘a’から指定可能です。

意味
‘w’既に同一のファイルが存在する場合、当該ファイルを削除のうえ、出力ファイルを新規作成する
‘x’既に同一のファイルが存在する場合はエラーとする
‘a’既に同一のファイルが存在する場合は当該ファイルに追記する
buffer = io.StringIO()
df.to_csv(buffer, mode="w")
print(buffer.getvalue())

encoding

出力ファイルの文字コードを指定します。指定できる文字コードはPython標準に準拠します。

buffer = io.StringIO()
df.to_csv(buffer, encoding="utf-8")
print(buffer.getvalue())

compression

zipやtarなどの圧縮形式で出力する引数です。

zip形式で圧縮した状態で出力する場合、以下のように指定します。

compression_opts = dict(method='zip', archive_name='out.csv')
df.to_csv('output/out.zip', compression=compression_opts)

quoting

引用符の取扱いを指定する引数で、以下の4つを指定可能です。対応する整数を指定する必要があります。

デフォルトはcsv.QUOTE_MINIMALで、ダブルクォートを引用符と認識します。

df.to_csv(buffer, quoting=0)

>>
,name,mask,number
0,Raphael,red,55110.0001
1,Donatello,,12345.6789
df.to_csv(buffer, quoting=1)

>>
"","name","mask","number"
"0","Raphael","red","55110.0001"
"1","Donatello","","12345.6789"
df.to_csv(buffer, quoting=2)

>>
"","name","mask","number"
0,"Raphael","red",55110.0001
1,"Donatello","",12345.6789
df.to_csv(buffer, quoting=3)

>>
,name,mask,number
0,Raphael,red,55110.0001
1,Donatello,,12345.6789

quotechar

引用符の文字を指定します。デフォルトはダブルクォート(“)です。

基本的にquotingと併せて使用します。

以下では、quotecharをシングルクォート(‘)に指定しています。

buffer = io.StringIO()
df.to_csv(buffer, quoting=1, quotechar="'")
print(buffer.getvalue())

>>
'','name','mask','number'
'0','Raphael','red','55110.0001'
'1','Donatello','','12345.6789'

date_format

日付型データの出力フォーマットを文字列で指定します。

検証のため、データフレームに日付型を追加します。

df['date'] = pd.to_datetime(['2025-05-05', '2025-05-06'])
df.to_dict(orient='records')

>>
[{'name': 'Raphael',
  'mask': 'red',
  'number': 55110.0001,
  'date': Timestamp('2025-05-05 00:00:00')},
 {'name': 'Donatello',
  'mask': None,
  'number': 12345.6789,
  'date': Timestamp('2025-05-06 00:00:00')}]

date列のフォーマットを”%Y/%m/%d”として出力するには、以下のように指定します。

buffer = io.StringIO()
df.to_csv(buffer, date_format="%Y/%m/%d")
print(buffer.getvalue())

>>
,name,mask,number,date
0,Raphael,red,55110.0001,2025/05/05
1,Donatello,,12345.6789,2025/05/06

errors

エンコードやデコード時にエラーが発生した際のハンドリングを指定します。以下の5つから指定でき、デフォルトは’strict’です。

意味
‘strict’変換できない文字があると、UnicodeErrorを送出する。
‘ignore’変換できない値は無視される。
‘replace’変換できない文字は�(U+FFFD)に変換される。
‘backslashreplace’変換できない文字はバックスラッシュのエスケープシーケンス(\xhh、 \uxxxx、 \Uxxxxxxxx)に変換される。
‘surrogateescape’変換できない文字はサロゲートコードポイント (0xDC00 – 0xDFFF)に変換される。
buffer = io.StringIO()
df.to_csv(buffer, errors="replace")

Pythonでデータサイエンスするなら

Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。

ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^

まとめ

pandasでデータフレームをCSVファイルに出力する方法を紹介しました。CSVファイルをPythonで扱うケースはかなりあると思うので、是非参考にしてみてください。

今回もかなりの量の引数を紹介したが、こういう引数あったなくらいで覚えておけばよい。後は、都度調べて使えるようになれば良いだろう。

今回はここまで。次回は、データフレームをCSVファイルとして出力する方法を紹介する。

ありがとうございました~~♪