【pandas】read_csv()、read_table() – csvファイルを読み込みDataFrameに変換

pandasでcsvファイルを読み込んでDataFrameに変換する方法を解説します。




csvやtsvを読み込む関数

pandasには、テーブル形式のデータをDataFrameオブジェクトとして読み込むための関数がいくつか用意されています。pandasのAPIリファレンスでは、Flat Fileを扱う関数として、以下の3つが示されています。

read_csv() コンマ区切りのファイルを読み込む。
read_table() タブ区切りのファイルを読み込む。
read_fwf() 区切り文字がなく、カラムの幅が一定のファイルを読み込む。

基本的には、read_csv()を使えるようになればいいと思います。

read_csv()read_table()は、デフォルトの区切り文字だけが違いますが、内部では同じ関数を使っています。そのため、パフォーマンスに差はありません。オプション引数の指定の仕方も共通です。

csv読み込みの基本

サンプルとして、次のようなcsvファイルを使います。

sample.csv
name,a,b,c,d
mike,1,2,3,4
kuro,5,6,7,8
tama,9,10,11,12
nora,13,14,15,16

csvファイルを読み込んでDataFrameに変換するには、read_csv()を使います。

import pandas as pd

df = pd.read_csv('sample.csv')
df
'''
   name   a   b   c   d
0  mike   1   2   3   4
1  kuro   5   6   7   8
2  tama   9  10  11  12
3  nora  13  14  15  16
'''

# df = pd.read_table('sample.csv', sep=',') でも、まったく同じです。

ヘッダー(列の名前)に関わる指定

上の例のように、オプション引数で特に指定しなければ、ファイルの1行目がヘッダー(列の名前)として読み込まれます。

ヘッダーがないファイルを読み込む

ファイルのはじめの行をヘッダーとしてではなく、データの本体部分として読み込むためには、header=Noneを指定します。

sample2.csv
mike,1,2,3,4
kuro,5,6,7,8
tama,9,10,11,12
nora,13,14,15,16
df = pd.read_csv('sample2.csv', header=None)
df
'''
      0   1   2   3   4
0  mike   1   2   3   4
1  kuro   5   6   7   8
2  tama   9  10  11  12
3  nora  13  14  15  16
'''
# 列名が、自動的に付加された数値になっている

ヘッダー行を指定する

headerに整数で指定した行を、列名が書かれている行として読み込みます。ただし、行はゼロ始まりで数えます。例えばheader=2を指定すると、0行目と1行目は無視され、2行目がヘッダーとして読み込まれます。

sample.csv
name,a,b,c,d
mike,1,2,3,4
kuro,5,6,7,8
tama,9,10,11,12
nora,13,14,15,16
df = pd.read_csv('sample.csv', header=2)
# 0行目と1行目は無視される

df
''' 
   kuro   5   6   7   8
0  tama   9  10  11  12
1  nora  13  14  15  16
'''

行のスキップ

先頭から何行かをスキップ

ファイルの先頭の何行かが不要な場合、skiprowsに整数で指定した行数をファイルの先頭からスキップして読み込むことができます。

sample.csv
name,a,b,c,d
mike,1,2,3,4
kuro,5,6,7,8
tama,9,10,11,12
nora,13,14,15,16
df = pd.read_csv('sample.csv', skiprows=2, header=None)
df
'''
      0   1   2   3   4
0  kuro   5   6   7   8
1  tama   9  10  11  12
2  nora  13  14  15  16
'''

# skiprows=2で先頭から2行をスキップするので、kuroの行がファイルの先頭行として扱われます
# そのため、headerに何の指定もなければ、kuroの行がヘッダーになります

df = pd.read_csv('sample.csv', skiprows=2)
df
'''
   kuro   5   6   7   8
0  tama   9  10  11  12
1  nora  13  14  15  16
'''

末尾から何行かをスキップ

ファイルの末尾の何行かが不要な場合、skipfooterに整数で指定した行数をファイルの末尾から除いて読み込むことができます。skipfooterを使うためには、engine='python'の指定が必要です。

df = pd.read_csv('sample.csv', skipfooter=1, engine='python')
df
''' 
   name  a   b   c   d
0  mike  1   2   3   4
1  kuro  5   6   7   8
2  tama  9  10  11  12
'''

指定した行数目をスキップ

「何行スキップするか」ではなく「何行目をスキップするか」を指定したい場合、skiprowsに整数のリストを指定することで、その行数目をスキップすることができます。何行目かは0から数えます。

df = pd.read_csv('sample.csv', skiprows=[1,4])
df
''' 
   name  a   b   c   d
0  kuro  5   6   7   8
1  tama  9  10  11  12
'''

列の名前を指定する

任意の列名をつけるには、オプション引数のnamesに、リスト形式(配列やタプルでも可)で列名を指定します。

namesを指定する場合、ファイルには列の名前を示すヘッダーがついていないという前提で読み込まれます。つまり、ファイルの1行目はデータの本体部分として扱われます。そのため、もともとのファイルの1行目がヘッダーになっているが、それとは別の名前を付けたくてnamesを指定する場合、header=0をつけます。

# ファイルの1行目のヘッダーの代わりに、任意の列名をつける場合(sample.csvはヘッダーあり)
df = pd.read_csv('sample.csv', names=['name', 'w', 'x', 'y', 'z'], header=0)

# ファイルにヘッダーがなく、任意の列名をつける場合(sample2.csvはヘッダーなし)
df = pd.read_csv('sample2.csv', names=['name', 'w', 'x', 'y', 'z'])

'''
どちらの結果も次のようになります。
   name   w   x   y   z
0  mike   1   2   3   4
1  kuro   5   6   7   8
2  tama   9  10  11  12
3  nora  13  14  15  16
'''

区切り文字を指定する

コンマやタブ以外の文字で区切られている場合、sepまたはdelimiterで区切り文字を指定します。どちらを使っても挙動は同じです。正規表現による指定も可能です。

sep=Noneengine='python'を指定することで、区切り文字を自動的に解釈してくれます。

sample3.txt
name/a/b/c/d
mike/1/2/3/4
kuro/5/6/7/8
tama/9/10/11/12
nora/13/14/15/16
# 区切り文字を指定する場合
df = pd.read_csv('sample3.txt', sep='/')
# 自動で解釈させる場合
df = pd.read_csv('sample3.txt', sep=None, engine='python')

skipinitialspace=Trueを指定すると、区切り文字のあとのスペースが無視されます。




参考:
pandas.read_csv (pandas 0.18.0 API Reference)
pandas.read_table (pandas 0.18.0 API Reference)




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です