DataFrameをCSV, TSVファイルに保存

DataFrameのデータをCSV, TSVファイルに保存します。CSV, TSVファイルからの読み込みはこちらの記事を参考にしてください。 

CSV, TSVファイルともに同じ関数を使用します。今回は以下の関数を紹介します。

pandas.DataFrame.to_csv
 DataFrameをCSV, TSVファイルに書き出します。

to_csvメソッド

read_csv/read_tableメソッド同様に、引数の数が多く全ては紹介しきれないので、今回使用するものだけをまとめていきます。

・path_or_buf
 型: 文字列、ストリームオブジェクト
 保存先を指定します。一般的にはファイルパスを指定します、
・sep
 型: 文字列
 区切り文字を指定します。デフォルトは「,(コンマ)」です。
 例えばTSV形式で保存したい場合は「\t(タブ)」を指定する必要があります。
・na_rep
 型: 文字列
 欠損値の表現方法を指定します。デフォルトは空文字列です。
・float_format
 型: 文字列
 floatの表現方法を指定します。printf形式で指定します。
・columns
 型: リスト
 保存したい列のラベルをリスト形式で指定します。何も指定しなければ全ての列が保存されます。
・header
 型: bool, リスト
 ヘッダを保存するかどうかを指定します。デフォルトはTrueでヘッダも保存されます。
 リスト形式で指定することで、ヘッダを置き換えることもできます。
・index
 型: bool
 インデックスを保存するかどうかを指定します。デフォルトはTrueでインデックスも保存されます。
・mode
 型: 文字列
 書き込み動作の方法を指定します。
 「'w'(書き込み)」「'a'(追加書き込み)」が良く使われると思います。
・encoding
 型: str
 ファイルの文字コードを指定します。デフォルトは"utf-8"です。
 List of Python standard encodingsも参考にしてください。

今回使用するDataFrameを準備します。

import pandas
import numpy

# 小数と欠損値が混ざっています。
df = pandas.DataFrame({"A": [1, 2, 3, 4.12345],
                       "B": [2, 3, 4, 5],
                       "C": [3, 4, numpy.nan, 6],
                       "D": [4, 5, 6, 7]},
                      index = [0, 1, 2, 3])
print(df)
print(df.columns)
print(df.index)

#          A  B    C  D
# 0  1.00000  2  3.0  4
# 1  2.00000  3  4.0  5
# 2  3.00000  4  NaN  6
# 3  4.12345  5  6.0  7
# Index(['A', 'B', 'C', 'D'], dtype='object')
# Int64Index([0, 1, 2, 3], dtype='int64')

ファイルへの保存(path_or_buf)

path_or_bufに保存先のファイルパスを指定することで保存できます。

df.to_csv("sample01.csv")

保存先としてsys.stdoutを指定することもできるようです。標準出力に内容が表示されます。ファイルにどのような形式で保存されるのかをコンソールで確認することができます。

import sys
df.to_csv(sys.stdout)

# ,A,B,C,D
# 0,1.0,2,3.0,4
# 1,2.0,3,4.0,5
# 2,3.0,4,,6
# 3,4.12345,5,6.0,7

以下、ファイルに保存されている内容を確認していくためにsys.stdoutに出力するようにしますが、必要に応じてファイル名などを指定してください。

区切り文字の変更(sep)

sepに区切り文字を指定することでTSV形式などで保存することができます。

df.to_csv(sys.stdout, sep="\t")

# 	A	B	C	D
# 0	1.0	2	3.0	4
# 1	2.0	3	4.0	5
# 2	3.0	4		6
# 3	4.12345	5	6.0	7

欠損値の表示(na_rep)

na_repを指定することで、欠損値の扱いを指定することができます。これまでの例では何も指定していなかったので、デフォルトの空文字列となっていました。

# 欠損値を0で表現する
df.to_csv(sys.stdout, na_rep=0)

# ,A,B,C,D
# 0,1.0,2,3.0,4
# 1,2.0,3,4.0,5
# 2,3.0,4,0,6
# 3,4.12345,5,6.0,7

floatの表現(float_format)

float_formatを指定することで、floatの表現方法を変えることができます。

# 有効数字3桁
df.to_csv(sys.stdout, float_format="%.3f")

# ,A,B,C,D
# 0,1.000,2,3.000,4
# 1,2.000,3,4.000,5
# 2,3.000,4,,6
# 3,4.123,5,6.000,7
# 指数形式
df.to_csv(sys.stdout, float_format="%.3e")

# ,A,B,C,D
# 0,1.000e+00,2,3.000e+00,4
# 1,2.000e+00,3,4.000e+00,5
# 2,3.000e+00,4,,6
# 3,4.123e+00,5,6.000e+00,7

保存する列を指定(columns)

columnsに保存する列を指定することができます。

# B, D列だけを保存
df.to_csv(sys.stdout, columns=["B", "D"])

# ,B,D
# 0,2,4
# 1,3,5
# 2,4,6
# 3,5,7

ヘッダの保存(header)

header=Falseを指定すると、ヘッダを含めずに保存することができます。

df.to_csv(sys.stdout, header=False)

# 0,1.0,2,3.0,4
# 1,2.0,3,4.0,5
# 2,3.0,4,,6
# 3,4.12345,5,6.0,7

headerにリスト形式で指定することで、ヘッダを置き換えることができます。

df.to_csv(sys.stdout, header=["a", "b", "c", "d"])

# ,a,b,c,d
# 0,1.0,2,3.0,4
# 1,2.0,3,4.0,5
# 2,3.0,4,,6
# 3,4.12345,5,6.0,7

indexの保存(index)

index=Falseと指定することで、indexを含めずに保存することができます。

df.to_csv(sys.stdout, index=False)

# A,B,C,D
# 1.0,2,3.0,4
# 2.0,3,4.0,5
# 3.0,4,,6
# 4.12345,5,6.0,7

書き込み動作(mode)

mode="w"(デフォルト)とすることで書き込み(上書き)、mode="a"とすることで追記していきます。

df.to_csv("sample1.csv", mode="w")

# ファイル内容
# ------------------
# ,A,B,C,D
# 0,1.0,2,3.0,4
# 1,2.0,3,4.0,5
# 2,3.0,4,,6
# 3,4.12345,5,6.0,7
# 同じDataFrameをヘッダなしで追加保存
df.to_csv("sample1.csv", mode="a", header=False)

# ファイル内容
# ------------------
# ,A,B,C,D
# 0,1.0,2,3.0,4
# 1,2.0,3,4.0,5
# 2,3.0,4,,6
# 3,4.12345,5,6.0,7
# 0,1.0,2,3.0,4
# 1,2.0,3,4.0,5
# 2,3.0,4,,6
# 3,4.12345,5,6.0,7

まとめ

今回はto_csvメソッドを使って、DataFrameの内容をファイルに保存する方法をまとめました。

・保存先はcsvだけではなく、tsvや標準出力等を指定することができます。
・ちなみに別のメソッドを使えばエクセルなどに保存することができます。別の機会に紹介します。
・header, indexなどを指定することで、保存方法を細かく制御することができます。

この記事が気に入ったらサポートをしてみませんか?