C#のDataTable には、XML形式によるファイルの入出力メソッドが用意されていますが、PythonのデータフレームではCSVファイルの入出力メソッドが用意されています。
今回はデータフレームにCSVファイルを読み込んだり、逆にCSVファイルとして書き出す方法を解説します。
Contents
CSVファイルの読み込み
CSVファイルをデータフレームに読み込むには、 read_csv 又は read_table メソッドを使います。
ここで注意が必要なのは、このメソッドはデータフレームのインスタンスに用意されているのではなく、pandas に用意されているという点です。
つまり、 df.read_csv() ではなく、 df = pd.read_csv() と書かなければなりません。

read_csv
read_csv の書式は次の通りです。
pd.read_csv(ファイルパス,sep=区切り文字,encoding=文字コード,engine=’python’)
sep は区切り文字(セパレータ)で、カンマ(,)やタブ(\t)を指定します。
encoding は文字コードで、’shift_jis’ や ‘utf_8’ が指定できますが、アンダースコアがハイフンになって ‘shift-jis’ 又は ‘utf-8’ となっても正しく動作します。
4つ目の engine はファイルパスに漢字が含まれている場合のみ必要な引数で、これを記述することでエラー無く読めるようになります。
尚、sep を省略した場合は カンマが、encodingを省略した場合は ‘utf_8’ が採用されます。
では、いくつかの例を挙げておきます。
1 2 3 4 5 6 |
import pandas as pd df = pd.read_csv('d:/data.csv') df = pd.read_csv('d:/data.csv',encoding='shift_jis') df = pd.read_csv('d:/data.csv',sep='\t') df = pd.read_csv('d:/data.csv',engine='python') |
read_csv には多くのパラメータがあるので、以下に紹介しておきます。
引数名 | 意味 |
---|---|
filepath_or_buffer | 読み込み元のファイルパス、又は URL を指定する。 第一引数にファイルパス又はURLを指定する場合は記述不要。 |
sep | 区切り文字の指定。(初期値: ’,’) |
delimiter | 区切り文字の指定。sep の代わりに delimiter と記述しても良い。(初期値: None) |
header | ヘッダの行番号 。(初期値: 0) 2を指定すると、0~1行目は無視され、2行目がヘッダとなり3行目以降が読み込まれる。 |
names | ヘッダ行をリストで指定。 (初期値: None) |
index_col | 行のインデックスに用いる列番号。 (初期値: None) |
dtype | 各行のデータタイプ。例: {‘x’: int, ‘y’: double} (初期値: None) |
skiprows | 先頭からスキップしたい行数。 (初期値: None) |
skipfooter | 末尾からスキップしたい行数。 (初期値: None) |
nrows | 読み込みたい行数。 (初期値: None) |
quotechar | ダブルクォーテーション等で括られている場合の括り文字。 (初期値: ‘”‘) |
escapechar | エスケープされている場合のエスケープ文字。 (初期値: None) |
comment | コメント行の行頭文字。指定した文字で始まる行は無視される。 (初期値: None) |
encoding | 文字コード。詳細は Python 文字コード一覧 を参照。(初期値: None) |
na_values | 値が無い(=欠損値)場合に埋める文字(初期値:NaN) |
read_table
区切り文字がタブの場合は、read_table というメソッドが使用可能です。
pd.read_table(ファイルパス,sep=区切り文字,encoding=文字コード,engine=’python’)
見てお分かりの通り、区切り文字がタブ以外は、read_csv と仕様は同じです。
index について
特に何も意識せず read_csv を実行すると、自動的に連番のインデックス(行ラベル)が作成されます。

自動ではなく、明示的に任意のカラムをインデックスに設定したい場合、index_col 引数にカラム番号又はカラム名を指定します。
1 2 |
df = pd.read_csv('d:/data.csv',index_col=2) df = pd.read_csv('d:/data.csv',index_col='col2') |
データフレームの中身をの print 等で表示した際、インデックスとして指定したカラムは左端に移動します。
しかし、ilocを使って番号で指定した場合は正しく取得できます。

CSVファイルの書き込み
データフレームの内容をCSVファイルに書き込むには、to_csv メソッドを使います。
ちなみに、CSV読み込み時には read_csv の他に to_table というメソッドもありましたが、CSV書き込みにはto_table というメソッドは存在しません。
to_csv
また、read_csv は pandas に備わっているメソッドでしたが、to_csv はデータフレームのインスタンスに備わっているメソッドになります。
つまり、データフレームのインスタンスが df だとすると、df.to_csv() と書かなければなりません。
さて、良く使う引数を含めた to_csv の書き方は次の通りです。
pf.to_csv(ファイルパス,mode=書き込みモード,sep=区切り文字,encoding=文字コード)
mode はファイル書き込み時において、既存のファイルが存在した時に上書きするか追加するかを指定します。
mode=’w’ の場合は上書き、mode=’a’ の場合は追加となります。
尚、modeの初期値は ’w’ なので、上書きして良い場合は指定する必要はありません。
sep と encoding は read_csv と同じです。
1 2 3 4 |
#データフレームのインスタンスが df で作成され、何らかの値が入っていることを前提 df.to_csv('d:\data.csv') df.to_csv('d:\data.csv',mode='a') df.to_csv('d:\data.csv',sep='\t',encoding='shift-jis') |
to_csv にも多くのパラメータがあるので、良く使いそうなものを紹介しておきます。
引数名 | 意味 |
---|---|
filepath_or_buffer | 読み込み元のファイルパス、又は URL を指定する。 第一引数にファイルパス又はURLを指定する場合は記述不要。 |
sep | 区切り文字の指定。(初期値: ’,’) |
delimiter | 区切り文字の指定。sep の代わりに delimiter と記述しても良い。(初期値: None) |
header | ヘッダを出力するか否か。(初期値: True) |
columns | カラム名を指定。 (初期値: None) |
index | インデックスを出力するか否か (初期値: None) |
index_label | インデックスの指定 (初期値: None) |
quotechar | ダブルクォーテーション等で括られている場合の括り文字。 (初期値: ‘”‘) |
line_terminator | 行末コード。 (初期値: ‘\n’) |
encoding | 文字コード。詳細は Python 文字コード一覧 を参照。(初期値: None) |
index について
read_csv でCSVファイルを読み込んだ場合、自動的に連番がインデックス(行ラベル)として付与されることをお話ししました。
実は、CSVファイルに書き込む際、このインデックスはファイルの左端に追加されて書き込まれます。

CSVを読み込む際、インデックスとして任意のカラムを指定できましたが、この場合は指定したカラムが左端に移動した状態で書き込まれることになります。
CSV書き込み時にインデックスを保存しなくない場合は、 index = False を記述します。
pf.to_csv(~~~,index=False)
もし index_col でインデックスのカラムを指定した場合、index = False とするとそのカラム自身が書き込まれなくなるので注意が必要です。
1 |
df.to_csv('p:\output.csv',index=False) |
まとめ
今回はCSVの内容をデータフレームに読み込んだり、データフレームの内容をCSVファイルに書き込んだりする方法について解説しました。
C#の場合、DataTableからCSVに出力したり読み込んだりするのは自分でコードを書く必要がありますが、Pythonなら pandas を使って簡単に実現できます。
インデックスという概念があるので最初は戸惑うかもしれませんが、保存するときに index=False と指定するだけで解決しますので、かなり使いやすいです。
是非皆さんもお試しください。