YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

pandas DataFrameをCSVに変換|to_csvをわかりやすく解説

pandasDataFrameSeriesは、.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()を使用すると便利です。
≫pandas DataFrameを文字列に変換|to_stringをわかりやすく解説
Pythonのデータ分析ライブラリpandasを使うと、データの加工、集計、可視化などを効率的に実行することができます。加工したSeriesやDataFrameを文字列に変換して出力したいこともありますよね。しかし、実際に文字列に変換しようとしても次のような問題に直面することも…①DataFrameを文字列に変換するメソッドは何?②ヘッダーやインデックスの有無を変更したい!③出力フォーマットをを調整することはできる?この記事ではDataFrameを文字列に変換する方法について詳しく解説します。
www.yutaka-note.com/entry/pandas_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のインデックスの基本については、次の記事を参考にしてください。
≫pandas インデックス列の基本操作|要素にアクセス、検索、欠損値処理
pandasのDataFrameでは、インデックス列の操作方法に関して、網羅的に解説!①インデックスの基本構造②インデックス内要素へのアクセス方法③インデックス内のデータ検索、並べ替え、重複処理、欠損値処理。サンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 

出力列の制限

デフォルト設定では、.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の欠損値処理については、次の記事で解説しています。
≫pandas 欠損値NaN処理一覧|抽出、除去、補間
pandasを使用すると欠損値NaNを効率的かつ高速に処理することができます。① NaNのある行や列を抽出する方法は?② NaNのある行や列を削除したい!③ NaNを他の値で置き換えたり、線形補間したりするにはどうするの?こんな悩みをサンプルコート付きでわかりやすく解決します!
www.yutaka-note.com/entry/pandas_na
 

数値の出力形式変更

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における時系列データの操作については、次の記事で解説しています。
≫pandas 文字列⇒Datetime変換|時系列操作を簡単マスター!
pandasで"文字列"をDatetimeに変換する方法、Datetimeの基本的な操作方法を解説します。"文字列"のままでは、日時関連の計算や条件判定が自由にできません…。Datetimeに変換して、日付の差分計算や便利な機能を使えるようにしましょう!
www.yutaka-note.com/entry/pandas_datetime
 

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()メソッドを使います。

≫Pandas DataFrameをExcel出力|to_excelわかりやすい図解
pandasのDataFrameは、.to_excel()メソッドを使用すると簡単にExcelの出力できます。この記事では.to_excel()について、次の内容について解説していきます。① Excelの保存先・書き込み方法の設定、② 出力シート、セルの指定、③ 表の見出しの設定、④出力内容の変更(出力列指定、欠損値、無限大、小数点桁数の出力設定)
www.yutaka-note.com/entry/pandas_to_excel
 

文字列で出力する場合は、to_string()メソッドを使います。

≫pandas DataFrameを文字列に変換|to_stringをわかりやすく解説
Pythonのデータ分析ライブラリpandasを使うと、データの加工、集計、可視化などを効率的に実行することができます。加工したSeriesやDataFrameを文字列に変換して出力したいこともありますよね。しかし、実際に文字列に変換しようとしても次のような問題に直面することも…①DataFrameを文字列に変換するメソッドは何?②ヘッダーやインデックスの有無を変更したい!③出力フォーマットをを調整することはできる?この記事ではDataFrameを文字列に変換する方法について詳しく解説します。
www.yutaka-note.com/entry/pandas_to_string
 

オススメ|pandasとデータ分析の勉強方法

今回はpandasの重複処理について図解付きで解説しました。

pandasは便利すぎて操作方法がわかりにくいことがよくあります…。

結局はコツコツ学ぶのが、pandasマスターの近道ですよね!

≫【ブログカテゴリー:pandas】

データ分析初心者の方にはこちらの記事もおススメです。

私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。

何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。

≫独学でデータ分析を勉強するオススメ学習本
独学でのpythonデータ分析勉強に役立ったおススメ書籍を紹介していきます。業務でそれなりにデータ分析を行えるまで、いろいろな試行錯誤をしてきましたが、もし自分が今ゼロから勉強する立場ならどうするのがいいのか考えてみました。以下では、入門書、個別モジュール用、実践用の3つの視点でおススメ本を紹介していきます。
www.yutaka-note.com/entry/data_analysis
 

オススメのpandas本については、次の記事で紹介しています。

≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
Python実践データ分析100本ノックで、実際に100本終了したレビューです。pythonでのデータ分析の入門書としてかなりの良書だったと思います。・python2~3冊目に何を勉強しようか迷っている人・時間をかけずにデータ分析の基本を学びたい人・pandasへの抵抗を減らしたい人
www.yutaka-note.com/entry/nock_100
 
≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
「Pythonによるデータ分析入門」を、最初から最後まで実際に実践してみたレビューです。具体的にどのようなことができるようになったかを実例付きで紹介します!・DataFrameの生成方法・欠損値の処理方法・グラフ化の方法気になる学習時間は…?
www.yutaka-note.com/entry/2019/12/07/230219