pandasの使い方 〜csv・tsvファイルの読み込み〜

csvやtsvなどの行列データを扱うのに便利なライブラリであるpandasについて解説。まずはデータの読み込み方法について。


動作環境の確認(必要なライブラリインポート)

pandasをimportする必要があります。以下を実行してエラーになった場合は、適宜インストールが必要です。anacondaをインストールするのが一番楽です。

import pandas as pd

注意事項

ここではjupyter notebookを用いて解説しています。jupyter notebookとはどんなものかはJupyter事始めなどを参照。以下では"df1"と、変数だけで出力している箇所がありますが、通常のpythonでは"print (df1)"といった形でprintをつけて実行する必要があります。


1. csvファイル取込の基本パターン

本例で用いるInputFile_01.csvの中身は以下の通り。

col1,col2,col3
a,b,1
aa,bb,20
aaa,bbb,3

csvファイルの取込みはpd.read_csv("ファイル名")。データフレーム型に格納した結果を返します。データフレーム型は2次元の配列とイメージは同じ。それに加え、行名、列名という概念があります。 取り込みたいファイル名だけを指定した場合、1レコード目のcol1、col2、col3が列名として使用され、行名は自動的に0から昇順に振られます。

df1 = pd.read_csv(u'InputFile_01.csv')
df1
col1 col2 col3
0 a b 1
1 aa bb 20
2 aaa bbb 3

2. ヘッダーのないcsvファイル

本例で用いるInputFile_02.csvの中身は以下の通り。

a,b,1
aa,bb,20
aaa,bbb,3

csvファイルの一行目からデータが収録されている場合(csvファイルにヘッダー、つまり列名が収録されていない場合)、header=Noneを指定します。その場合、列名は0から昇順に振られます。

df2_1 = pd.read_csv(u'InputFile_02.csv', header=None)
df2_1
0 1 2
0 a b 1
1 aa bb 20
2 aaa bbb 3

csv読み込みと同時に項目名を設定したい場合は、names=[u'項目名1', u'項目名2'・・]を指定します。

df2_2 = pd.read_csv(u'InputFile_02.csv', header=None, names=[u'col1', u'col2', u'col3'])
df2_2
col1 col2 col3
0 a b 1
1 aa bb 20
2 aaa bbb 3

3. 行名をcsvファイルのとある列から指定したい場合

本例で用いるInputFile_03.csvの中身は以下の通り。

col1,col2,col3
1,aa,aaa
2,bb,bbb
3,cc,ccc

csvの先頭列にシーケンシャルNoが付与されているなど、行名にcsvファイルのとある列を指定したい場合、index_col=<列番号>を指定します。列番号は0からカウントします。

df3 = pd.read_csv(u'InputFile_03.csv', index_col=0)
df3
col2 col3
col1
1 aa aaa
2 bb bbb
3 cc ccc

4. 先頭行をスキップして読み込みたい場合

本例で用いるInputFile_04.csvの中身は以下の通り。

2018-01-04 18:00:00
col1,col2,col3
a,aa,aaa
b,bb,bbb
c,cc,ccc

ファイルによっては一行目に制御系の情報(レコードサイズや業務日付)といった情報が収録されており、読み込みたくない場合があります。その場合はskiprows=<スキップする行数> を指定します。

df4 = pd.read_csv(u'InputFile_04.csv', skiprows=1)
df4
col1 col2 col3
0 a aa aaa
1 b bb bbb
2 c cc ccc

5. 文字コードの指定

本例で用いるInputFile_05_s-jis.csv、InputFile_05_utf8.csvの中身は以下の通り。前者の文字コードはshift-jis、後者はutf8にて記載したものです。

名前,値段
きゅうり,100
茄子,120
トマト, 60

日本語も問題なく扱えますが、文字コード(windowsだとshift-jis、Linuxmacutf-8)が違う場合はencodingオプションで指定する必要あります。オプションを指定しない場合、文字化けします。オプションはencoding = <文字コード>です。例えば、Linux環境でs-jisのファイルをオプション指定なしで開こうとした場合、以下のようになります。

df5_1 = pd.read_csv(u'InputFile_05_s-jis.csv')
df5_1
���O �l�i
0 ���イ�� 100
1 �֎q 120
2 �g�}�g 60

この場合、encoding='s-jis'を入れることで文字化けせずに読み込みできます。

df5_2 = pd.read_csv(u'InputFile_05_s-jis.csv', encoding='s-jis')
df5_2
名前 値段
0 きゅうり 100
1 茄子 120
2 トマト 60

InputFile_05_utf-8.csvutf-8のファイルです。本実行環境はLinuxなので、utf-8ならオプションがなくても文字化けしません。

df5_3 = pd.read_csv(u'InputFile_05_utf-8.csv')
df5_3
名前 値段
0 きゅうり 100
1 茄子 120
2 トマト 60

encodingですが、's-jis', 'utf_8', 'utf_8_sig'の3つを覚えていれば困ることはないかと思います。'utf_8_sig'はこれまで説明していませんでしたが、UTF-8にはBOM付きとBOM無しの2パターン有ります。BOM付きは 'utf_8_sig'、BOM無しは'utf_8'です。ここでは両者の違いの説明は割愛しますが、サクラエディタなどのエディタでひらけばどの文字コードなのかが確認できるので、それに合わせてencodingを指定します。

6. 型の指定

本例で用いるInputFile_06.csvの中身は以下の通り。

col1,col2,col3
0001,aa,0111
0002,bb,1.0
3,cc,ccc,0.01

read_csvは各列の型を自動的に判定して定義してくれます。ですが、自分が期待しない型で定義されることもあります。例えば'0001'のような値の場合、数値型とみなされ1で取り込まれます。

df6_1 = pd.read_csv(u'inputFile_06.csv')
df6_1
col1 col2 col3
0 1 aa 111.000
1 2 bb 1.000
2 3 cc 0.001

データフレーム.dtypesで各列の型が確認できます。以下のように、col1はint型、col3はfloat型で取り込まれた結果、元のcsvとは異なる文字になってしまっています。

print df6_1.dtypes
col1      int64
col2     object
col3    float64
dtype: object

型を明示的に指定したい場合、dtype = { u'項目名1' : '型名', u'項目名2' : '型名'・・}とします。主な型名は以下の通りです。

文字列 整数型 浮動小数
'object' 'int' 'float'
df6_2 = pd.read_csv(u'inputFile_06.csv', dtype = { u'col1' : 'object', u'col3' : 'object' })
df6_2
col1 col2 col3
0 0001 aa 0111
1 0002 bb 1.0
2 3 cc 0.001
print df6_2.dtypes
col1    object
col2    object
col3    object
dtype: object

意図せずデータが欠落するのを防ぐため、全項目を文字列型('object')で読み込み、あとで必要に応じて別な型に変換するといった場合、dtype = 'object'を使います。

df6_3 = pd.read_csv(u'inputFile_06.csv', dtype = 'object')
df6_3
col1 col2 col3
0 0001 aa 0111
1 0002 bb 1.0
2 3 cc 0.001
print df6_3.dtypes
col1    object
col2    object
col3    object
dtype: object

7. tsvファイルの取込み

col1 col2    col3
a   b   1
aa  bb  20
aaa bbb 3

tsvファイル(区切り文字がtab)を読み込む場合は、read_table("ファイル名")を使用します。

df7_1 = pd.read_table(u'inputFile_07.tsv')
df7_1
col1 col2 col3
0 a b 1
1 aa bb 20
2 aaa bbb 3

もしくはread_csvを使い、delimiter = '\t'(windowsだと'¥t')を指定します。delimiter =は区切り文字を自由に指定できるので、,(カンマ)やタブ以外の区切り文字にも対応できます。

df7_2 = pd.read_csv(u'inputFIle_07.tsv', delimiter='\t')
df7_2
col1 col2 col3
0 a b 1
1 aa bb 20
2 aaa bbb 3