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、Linuxやmacはutf-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.csvはutf-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 |