pandas
のDataFrame
, Series
は、.to_csv()
メソッドで簡単にCSVに出力できます。
CSVは様々なソフトウェアで使いやすいフォーマットなので、CSVで出力できるのはとても便利ですね。
しかし、実際に出力しようとすると、次のような問題に直面することも…
- 出力ファイルの指定方法は?
- カラムの出力方法は?
- 欠損値の扱いは?
そこで、この記事では.to_csv()
について、次の内容について解説していきます。
- 出力ファイルの指定
- ヘッダー、インデックスの出力有無
- 出力フォーマットの変更
それでは、.to_csv()
メソッドの機能について、詳しく見ていきましょう。
CSV出力の基本
DataFrame
をCSV形式で出力する最も基本的な方法は、.to_csv()
メソッドにファイル名(またはファイルのパス)を渡す方法です。
df.to_csv("ファイル名.csv")
→ 作業フォルダに保存df.to_csv("ファイルパス")
→ ファイルパスの場所に保存
これだけで、df
をCSV形式で出力することができます。
次のサンプルデータで挙動を確認してみましょう。
import pandas as pd
df = pd.DataFrame({
"Ind": ["Data1", "Data2", "Data3"],
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}).set_index("Ind")
df
# A B C
# Ind
# Data1 1 4 7
# Data2 2 5 8
# Data3 3 6 9
.to_csv()
メソッドを実行して、サンプルデータをCSV形式で出力してみます。
df.to_csv("sample.csv")
次のようなCSVファイルが出力されます。
.to_csv("ファイル名.csv")
のデフォルト挙動は下記の通りです。
"ファイル名.csv"
のcsvファイルを新規に作成","
区切りのCSVを出力- 全てのデータを出力
- ヘッダー、インデックスも全て出力
既存の同名ファイルがあっても上書きするので、大事なファイルを上書きしないように注意しましょう。
以下では、引数を指定した.to_csv()
の詳しい設定内容について解説していきます。
to_csv基本設定一覧
.to_csv()
メソッドの引数を設定して出力形式をカスタマイズできます。
主な引数は次の通りです。
分類 | 設定内容 | 引数名 | 設定例(太字:デフォルト) |
---|---|---|---|
保存 | 保存名 | path_or_buf (省略可) |
保存先のファイル名またはパスを指定 デフォルト( None )だと文字列を返す |
見出し | ヘッダーの出力 | header |
True , or False |
インデックスの出力 | index |
True , or False |
|
インデックス名の出力 | index_label |
True , or False |
|
出力制限 | 出力する列の制限 | columns |
デフォルトでは全列[列名のリスト] を指定して指定可 |
書式詳細 | 区切り文字の指定 | sep |
',' , 任意の文字列に変更可能 |
欠損値の表記 | na_rep |
''(空白) 任意の文字列に変更可能 |
|
数値の出力形式 | float_format |
フォーマット指定子で数値の出力形式を指定。 例) "%.2f" →小数点以下2桁まで出力 |
|
日付の出力形式 | date_format |
フォーマット指定子で日付の出力形式を指定。 例) %Y/%m%/d%" →"2021/12/31" の形式 |
|
圧縮 | 出力時に圧縮 | compression |
圧縮形式を指定。 デフォルトはファイル名で圧縮の有無判断 |
以下では、引数を指定して.to_csv()
の出力形式をカスタマイズする方法を紹介していきます。
出力先の指定
CSVファイルとしてdf
を保存する場合は、.to_csv()
にファイル名またはファイルパスを渡します。
引数として、保存先を渡さないと文字列としてCSV形式の出力を返すことも可能です。
引数の指定内容 | 出力方法 |
---|---|
.to_csv('ファイル名.csv') |
カレントフォルダにCSVを保存 |
.to_csv('ファイルパス.csv') |
ファイルパスにCSVを保存 |
.to_csv() |
CSVを文字列として出力 |
サンプルコードで挙動を確認してみます。
# ファイル名の指定
df.to_csv("sample.csv")
# ファイルパスの指定
# df.to_csv("C:\\~省略~\\sample.csv")
次のように、作業フォルダにCSVファイルが保存されます。
ファイル名を指定せずに、文字列として出力する例も確認してみましょう。
s = df.to_csv()
# sの中身の確認
s
# 'Ind,A,B,C\r\nData1,1,4,7\r\nData2,2,5,8\r\nData3,3,6,9\r\n'
あくまで文字列なので改行は改行コード\r\n
として格納されていますね。
print()
関数で出力したり、テキストファイルとして出力したりすると、改行コードは展開されて改行になります。
print(s)
# Ind,A,B,C
# Data1,1,4,7
# Data2,2,5,8
# Data3,3,6,9
- 【参考】CSV形式以外の文字列で出力する場合は、
to_string()
を使用すると便利です。
以下の解説では、ファイル名の指定はせずに、基本的に文字列として出力しています。
見出しの出力有無
ヘッダー、インデックスなど見出し関係の引数は次の通りです。
設定内容 | 引数名 | 設定例(太字:デフォルト) |
---|---|---|
ヘッダー(列名)の出力 | header |
True , or False |
インデックス(行名)の出力 | index |
True , or False |
インデックス名の出力 | index_label |
True , or False |
True
, False
で表示/非表示を切り替えます。
サンプルコードで挙動を確認してみましょう。
df.to_csv()
# Ind,A,B,C
# Data1,1,4,7
# Data2,2,5,8
# Data3,3,6,9
df.to_csv(header=False, index=False)
# 1,4,7
# 2,5,8
# 3,6,9
ヘッダー、インデックスの表示/非表示の設定用引数は次の図のように対応しています。
- 【参考】
pandas
のインデックスの基本については、次の記事を参考にしてください。
出力列の制限
デフォルト設定では、.to_csv()
メソッドでは全列を出力します。
columns
引数を指定することで、出力する列を制限することができます。
columns
=[列名のリスト]
サンプルデータで挙動を確認してみます。
df.to_csv(columns=["A", "C"])
# Ind,A,C
# Data1,1,7
# Data2,2,8
# Data3,3,9
指定した列のみが出力されていますね、結果を整理して出力する際に便利です。
書式の詳細設定
CSVの詳細な書式設定として、下表の設定内容について解説します。
設定内容 | 引数名 | 設定例(太字:デフォルト) |
---|---|---|
区切り文字の指定 | sep |
',' , 任意の文字列に変更可能 |
欠損値の表記 | na_rep |
''(空白) 任意の文字列に変更可能 |
数値の出力形式 | float_format |
フォーマット指定子で数値の出力形式を指定。 例) "%.2f" を指定すると、小数点以下2桁まで出力 |
日付の出力形式 | date_format |
フォーマット指定子で日付の出力形式を指定。 例) %Y/%m%/d%" を指定すると、"2021/12/31" のような形式 |
以下では、引数を指定して.to_csv()
の出力形式をカスタマイズする方法を紹介していきます。
区切り文字の指定
デフォルト設定では、.to_csv()
メソッドは","
区切りのCSVを生成します。
sep
引数を指定することで、区切り文字を変更することができます。
sep
="変更したい区切り文字"
サンプルデータで挙動を確認してみます。
# tab区切り
df.to_csv(sep="\t")
# Ind A B C
# Data1 1 4 7
# Data2 2 5 8
# Data3 3 6 9
# スペース区切り
df.to_csv(sep=" ")
# Ind A B C
# Data1 1 4 7
# Data2 2 5 8
# Data3 3 6 9
# ;区切り
df.to_csv(sep=";")
# Ind;A;B;C
# Data1;1;4;7
# Data2;2;5;8
# Data3;3;6;9
指定した列のみが出力されていますね、結果を整理して出力する際に便利です。
欠損値出力内容の変更
デフォルト設定では、.to_csv()
メソッドは欠損値""(空白文字)
で返します。
na_rep
引数を指定することで、欠損値の出力内容を変更することができます。
na_rep="欠損値の出力内容"
サンプルデータで挙動を確認してみます。
df = pd.DataFrame({
"Ind": ["Data1", "Data2", "Data3"],
'A': [1, None, 3],
'B': [4, 5, None],
'C': [7, 8, 9]
}).set_index("Ind")
# A B C
# Ind
# Data1 1.0 4.0 7
# Data2 NaN 5.0 8
# Data3 3.0 NaN 9
# to_csv()による出力内容
df.to_csv()
# Ind,A,B,C
# Data1,1.0,4.0,7
# Data2,,5.0,8
# Data3,3.0,,9
欠損値部分は空白文字になっていますね。
na_rep
で、欠損値の出力内容を変更してみます。
df.to_csv(na_rep="N/A")
# Ind,A,B,C
# Data1,1.0,4.0,7
# Data2,N/A,5.0,8
# Data3,3.0,N/A,9
欠損値が、文字列"N/A"
で出力されるようになりました。
- 【参考】pandasの欠損値処理については、次の記事で解説しています。
数値の出力形式変更
float_format
引数を使用すると、数値の出力形式をカスタマイズできます。
次のような%で始まる書式指定子を使用して、フォーマットを変更できます。
書式指定子 | 説明 | 使用例 |
---|---|---|
%d |
整数 | 整数で出力:float_format=%d |
%f |
浮動小数点数 | 小数点2ケタまで出力:float_format=%.2f |
%e |
指数表記 | 小数点2ケタまで出力:float_format=%.2e |
%g |
浮動小数点数または指数表記 | 小数点、指数を自動選択:float_format=%g |
書式指定子は、次のように全体の文字数、小数点以下の文字数を指定することも可能です。
全体の文字数.小数点以下の文字数%指定子
サンプルコードで、使用方法を確認してみましょう。
import numpy as np
df = pd.DataFrame({
'A': [1, 2.345, 0.0000123],
'B': [np.pi, np.e, None],
})
df.index.name = "I"
整数、浮動小数、指数でそれぞれ表示してみます(見やすいようにタブ区切りに変更)。
# 整数で出力
print(df.to_csv(float_format='%d', sep="\t"))
# I A B
# 0 1 3
# 1 2 2
# 2 0
# 小数点2ケタまで出力
print(df.to_csv(float_format='%.2f', sep="\t"))
# I A B
# 0 1.00 3.14
# 1 2.35 2.72
# 2 0.00
# 指数で出力
print(df.to_csv(float_format='%.3e', sep="\t"))
# I A B
# 0 1.000e+00 3.142e+00
# 1 2.345e+00 2.718e+00
# 2 1.230e-05
# 小数または指数を自動選択
print(df.to_csv(float_format='%g', sep="\t"))
# I A B
# 0 1 3.14159
# 1 2.345 2.71828
# 2 1.23e-05
日付の出力形式変更
date_format
引数を使用すると、日付の出力形式をカスタマイズできます。
次のような%で始まる書式指定子を使用して、フォーマットを変更できます。
フォーマット指定子 | 指定内容 | 2021年11月23日13時10分45秒の例 |
---|---|---|
"%Y" |
4桁の年 | "2021" |
"%y" |
2桁の年 | "21" |
"%m" |
2桁の月 | "11" |
"%B" |
英語月名 | "November" |
"%b" |
英語月名(短縮) | "Nov" |
"%d" |
2桁の日にち | "23" |
"%H" |
2桁の時間(24時間) | "13" |
"%I%p" |
2桁の時間(12時間)AM or PM | "01PM" |
"%M" |
分 | "10" |
"%S" |
秒 | "45" |
"%X" |
HH:MM:SSをまとめて出力 | "13:10:45" |
日付を含むサンプルデータで、使用方法を確認してみましょう。
data = {
"Date": pd.date_range("2020/4/1", freq="D", periods=3),
"Wether": ["Sunny", "Rainy", "Cloudy"],
"Temp": [25, 20, 23]
}
df = pd.DataFrame(data).set_index("Date")
df
書式指定子で日付の出力形式を変更してみましょう。
# %Y年%m月%d日
df.to_csv(date_format="%Y年%m月%d日", sep="\t")
# Date Wether Temp
# 2020年04月01日 Sunny 25
# 2020年04月02日 Rainy 20
# 2020年04月03日 Cloudy 23
# %d, %B
print(df.to_csv(date_format="%d,%B", sep="\t"))
# Date Wether Temp
# 01,April Sunny 25
# 02,April Rainy 20
# 03,April Cloudy 23
- pandasにおける時系列データの操作については、次の記事で解説しています。
CSV出力時に圧縮
.to_csv()
メソッドでは、CSVファイルの出力時にCSVファイルを圧縮することができます。
compression
引数で形式やファイル名を設定可能ですが、次のようにファイル名に拡張子を追加すると自動で圧縮してくれます。
df.to_csv("ファイル名.csv.zip")
次のような圧縮形式などに対応しています。
圧縮形式 | 拡張子 |
---|---|
zipファイル | ".zip" |
gzipファイル | ".gz" |
tarファイル | ".tar" |
zip形式で圧縮する場合の実行例を紹介します。
df.to_csv("sample.csv.zip")
"sample.csv.zip"フォルダ内に"sample.csv"ファイルが出力されます。
CSVファイルが大きい場合には、圧縮することでファイルサイズを小さくすることができますね。
その他の形式で出力する方法
CSV以外の形式で出力する場合は、適切なメソッドを使用しましょう。
Excel形式で出力する場合は、to_excel()
メソッドを使います。
文字列で出力する場合は、to_string()
メソッドを使います。
オススメ|pandasとデータ分析の勉強方法
今回はpandas
の重複処理について図解付きで解説しました。
pandas
は便利すぎて操作方法がわかりにくいことがよくあります…。
結局はコツコツ学ぶのが、pandas
マスターの近道ですよね!
データ分析初心者の方にはこちらの記事もおススメです。
私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。
何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。
オススメのpandas
本については、次の記事で紹介しています。