pandasを使ったデータの読み書きには、テキストファイルをディスク上から読み込む方法、データベース、APIからデータを取得する方法など、様々なパターンがあげられる。

今回はテーブル形式のテキストファイルを、pandasのデータフレームとして読み込む方法を紹介する。

サンプルCSVファイルの用意

まずはサンプル用のファイルを用意しよう。

ターミナルで以下のとおりファイルを用意する。

cd ~
mkdir examples
vim examples/ex1.csv

# 下記内容のファイルを作成する
a,b,c,d,message
1,2,3,4,hoge
5,6,7,8,fuga
9,10,11,12,foo

ファイルの読み込み

ファイルを作成したら、Jupyter Notebookで以下のコードを実行する。
ファイルの読み込みはread_csv関数を使用する。

import pandas as pd

df = pd.read_csv('examples/ex1.csv')
#    a   b   c   d message
# 0  1   2   3   4    hoge
# 1  5   6   7   8    fuga
# 2  9  10  11  12     foo

なお、read_table関数でもファイルを読み込むことはできるが、区切り文字をsepオプションで指定する必要がある。

df = pd.read_table('examples/ex1.csv', sep=',')

headerオプション

ファイルにヘッダー行が含まれないケースも多々あるだろう。
その場合は、headerオプションにNoneを指定すればOKだ。

# examples/ex2.csv
1,2,3,4,hoge
5,6,7,8,fuga
9,10,11,12,foo
df2 = pd.read_csv('examples/ex2.csv', header=None)
#    0   1   2   3     4
# 0  1   2   3   4  hoge
# 1  5   6   7   8  fuga
# 2  9  10  11  12   foo

namesオプション

また、ヘッダー行がないファイルの場合、namesオプションでファイルの読み込み時に任意のヘッダーを設定することもできる。

df2 = pd.read_csv('examples/ex2.csv', names=['a', 'b', 'c', 'd', 'message'])
print(df2)
#    a   b   c   d message
# 0  1   2   3   4    hoge
# 1  5   6   7   8    fuga
# 2  9  10  11  12     foo

index_colオプション

任意の列をデータフレームのインデックスにしたい場合、index_colオプションに列インデックス番号か列名を指定する。

df2 = pd.read_csv('examples/ex2.csv',
                  names=['a', 'b', 'c', 'd', 'message'],
                 index_col='message')
#          a   b   c   d
# message               
# hoge     1   2   3   4
# fuga     5   6   7   8
# foo      9  10  11  12

sepオプションで正規表現指定

区切り文字にカンマなどの決まった文字が無い場合は、read_table関数のsepオプションへ正規表現を指定することで対応することができる。

1 2 3 4 hoge
5 6 7 8 fuga
9 10 11 12 foo
df3 = pd.read_table('examples/ex3.csv', sep='\s+')
#    1   2   3   4  hoge
# 0  5   6   7   8  fuga
# 1  9  10  11  12   foo

skiprowsオプション

以下のように不要な行が含まれたファイルを読み込む場合、skiprowsオプションを使って不要な行を読み込まないようにすることもできる。

1,2,3,4,hoge
test
test2
5,6,7,8,fuga
test3
9,10,11,12,foo
df3 = pd.read_csv('examples/ex4.csv', header=None, skiprows=[1, 2, 4])
#    0   1   2   3     4
# 0  1   2   3   4  hoge
# 1  5   6   7   8  fuga
# 2  9  10  11  12   foo