概要
Pythonモジュールのpandasには、read_csv(又はread_excel等)という、csvやexcelのデータを分析に適した形で読み込む強力な関数があります。ただし、本関数には沢山の引数(44個)があり、公式マニュアルに簡易的な説明はありますが、全体的に使い方の分からないパラメータが多く、自分としてはこれによりpandasのとっつきにくさがアップしている気がしました。
⇒何とか整理してみようというのがこの記事。
どんな引数があるのか?
| filepath_or_buffer | sep | engine |
| lineterminator | quotechar | quoting |
| skipinitialspace | escapechar | dtype |
| compression | dialect | header |
| skiprows | index_col | names |
| prefix | na_values | true_values |
| false_values | keep_default_na | parse_dates |
| keep_date_col | date_parser | dayfirst |
| thousands | comment | decimal |
| nrows | iterator | chunksize |
| skipfooter | converters | verbose |
| delimiter | encoding | squeeze |
| na_filter | usecols | mangle_dupe_cols |
| tupleize_cols | error_bad_lines | warn_bad_lines |
| infer_datetime_format | skip_blank_lines |
特に断りがない限り、使うデータは、パラメータの効果がわかり易くなるよう、タブ区切りだったり、文字列と空白と数値が混在していたりと、以下のようなちょっと癖のあるものにしています。

filepath_or_buffer
本パラメータは、読み込むファイル名を指定するときに使うパラメータです。ただし、以下①、②に示すように、引数なしで動きますので実際に使うことはないでしょう。日本語はデフォルトだとutf_8形式で保存した場合のみ文字化けなく読み込めます。それ以外の形式の場合はencodingを参照ください。
import pandas as pd
#①と②のどちらの書き方でも処理は同じ。
df = pd.read_csv('test.txt') #①
df = pd.read_csv(filepath_or_buffer='test.txt') #②
Out[1]:
D001\tD002\tD003\tD004\tD005\tデータ6
0 0\t\ta\t5\tA\tD
1 0\t\t0\t0\tB\t
2 0\t\t0\t0\tA\t0
3 0\t\t0\t\tB\t12
4 0\t\t0\t0\tA\tD
5 1\t\t1\t1\tB\tC
6 2\t\t2\t2\tA\t24
7 3\t\t3\t3\tB\t36
8 3.5\t\t3.5\t3.5\tA\tD
9 5\t5\t5\t5\tB\t5
sep or delimiter
区切りの形式を指定するパラメータ。下記の例はsepにタブ区切り(\t)を渡した結果ですが、タブでデータを区切れていることが分かります。なお、delimiterにタブ区切りを指定しても結果は同じでした。また、違う値をsepとdelimiter同時に指定した場合にはdelimiterが優先されました。
import pandas as pd
df = pd.read_csv('test.txt', sep='\t')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0.0 NaN a 5.0 A D
2 0.0 NaN 0 0.0 B NaN
3 0.0 NaN 0 0.0 A 0
4 0.0 NaN 0 NaN B 12
5 0.0 NaN 0 0.0 A D
6 1.0 NaN 1 1.0 B C
7 2.0 NaN 2 2.0 A 24
8 3.0 NaN 3 3.0 B 36
9 3.5 NaN 3.5 3.5 A D
10 NaN NaN NaN NaN NaN NaN
11 5.0 5 5 5.0 B 5
engine
読み込み処理をCで実施するかPythonで実施するかを指定するパラメータ。マニュアルにはCの方が早いと書かれており、検証したところ確かに1割~くらい早いことを確認しました。ちなみに、デフォルトはCなので、あえてPythonを指定したいとき以外は使うことはないと思います。
%timeit pd.read_csv('test.txt', delimiter='\t', engine='c')
1000 loops, best of 3: 771 µs per loop
%timeit pd.read_csv('test.txt', delimiter='\t', engine='python')
1000 loops, best of 3: 871 µs per loop
Python3.6を使う場合に日本語パス名を読み込もうとするとエラー「Initializing from file failed」が発生することがあります。この場合は’python’を使うことで対策出来ます。詳細はこちら。
lineterminator
改行文字を指定するパラメータ。デフォルトでは\rですが、これを使うことで他の記号にも代えられます。
import pandas as pd
df = pd.read_csv('test.txt', lineterminator='\t')
Out[1]:
D001
0 D002
1 D003
2 D004
3 D005
4 データ6\r\n
5 \r\n0
6 a
.
.
.
quotechar
クォテーションを指定するパラメータ。デフォルトは”(ダブルクォテーション)。クォテーションで挟まれた値は1つのデータとみなし、下例のように、sep or delimiterで指定した区切り記号があっても無視されます。
import pandas as pd
#指定なし
df = pd.read_csv('test2.txt', delimiter='\t')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0 NaN 'a 5' 'A' 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
#指定あり
df = pd.read_csv('test2.txt', delimiter='\t', quotechar='\'')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0.0 NaN a\t5 A D NaN
2 0.0 NaN 0 0 B NaN
3 0.0 NaN 0 0 A 0
quoting
クォテーションで囲まれた値の処理方法を指定するパラメータ。デフォルトは0ですが、以下のように4種の値を指定できます。値を変えて試してみたところ、0,1,2はクォテーションで囲まれた部分を1データとして抽出、3はクォテーションも含めて文字列として抽出されました。0,1,2の違いは今のところ不明です。
0:QUOTE_MINIMAL
1:QUOTE_ALL
2:QUOTE_NONE
3:NONNUMERIC
import pandas as pd
#0~2まではクォテーションで囲まれている中身を取り出す。動作の違いは不明。
df = pd.read_csv('test2.txt', delimiter='\t', quotechar='\''、quoting=0)
df = pd.read_csv('test2.txt', delimiter='\t', quotechar='\''、quoting=1)
df = pd.read_csv('test2.txt', delimiter='\t', quotechar='\''、quoting=2)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0.0 NaN a\t5 A D NaN
2 0.0 NaN 0 0 B NaN
3 0.0 NaN 0 0 A 0
#3はクォテーションも含めて文字列として取扱い
df = pd.read_csv('test2.txt', delimiter='\t', quotechar='\''、quoting=3)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0 NaN 'a 5' 'A' 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
skipinitialspace
sep or delimiterで指定した区切り記号の次にあるスペースを無視するかどうかを指定するパラメータ。デフォルトはFalse。以下例ではAの前に半角スペースをつけており(つまり\t A)、仕様通りTrueとFalseの場合で値が一致しないことを確認。
import pandas as pd
#True
df = pd.read_csv('test4.txt', sep='\t', skipinitialspace=True)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0 NaN a 5 A D
#False
df2 = pd.read_csv('test4.txt', sep='\t', skipinitialspace=False)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0 NaN a 5 A D
#見た目ではわからないが、Falseの方はAの前に半角スペースがあり、Trueの結果とは一致しない。
df['D005'][1] == df2['D005'][1]
Out[1]: False
escapechar
このパラメータで指定した記号直後のエスケープシーケンスを文字列として扱うパラメータ。
import pandas as pd
#指定なし
df = pd.read_csv('test2.txt', sep='\t')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0 NaN 'a 5'| 'A' 'D'
#|を指定することで、直後のエスケープシーケンスが無効になり、\tの文字列で表示されている。
df2 = pd.read_csv('test2.txt', sep='\t', escapechar='|')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0 NaN 'a 5'\t'A' 'D' NaN
dtype, names, skiprows
各列のデータ形式を指定するパラメータ。デフォルトではデータから型を自動判断するようになっていますが、数値でなく文字列で扱いたい場合など、明示的に指定したい場合に使います。指定方法は、データ名と型式を辞書形式のデータにして渡すのですが、この時併せてデータ名をnames変数に渡しておく必要があります。下の2つ目の例では、D001とD002を1文字の文字列(S1)として読み込むように設定しています。確認するとたしかに1文字長となっていますが、2行目にゴミが残っていますね。これを消すためには、skiprowsに1を指定します。skiprowsは指定した列だけデータから読み込ませないようにするパラメータです。3つ目の結果を確認すると、正しく読めていることが分かります。とはいえ、せっかくheaderにあるものをハードコーディングして読み込ませるなんてばかばかしいですよね。これの対処方法は別記事で紹介しようと思います。
import pandas as pd
#何も指定しない場合
df = pd.read_csv('test2.txt', sep='\t')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0 NaN 'a 5'| 'A' 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
4 0 NaN 0 NaN B 12
5 0 NaN 0 0 A D
6 1 NaN 1 1 B C
7 2 NaN 2 2 A 24
8 3 NaN 3 3 B 36
9 3.5 NaN 3.5 3.5 A D
10 NaN NaN NaN NaN NaN NaN
11 5 5 5 5 B 5
#D001とD002を1文字長の文字列として読み込み指定。
df2 = pd.read_csv('test2.txt', sep='\t', dtype={'D001':'S1','D002':'S1'}, names=['D001','D002','D003','D004','D005',u'データ6'])
Out[1]:
D001 D002 D003 D004 D005 データ6
0 � D D003 D004 D005 データ6
1 NaN NaN NaN NaN
2 0 'a 5'| 'A' 'D'
3 ' 0 0 B NaN
4 0 0 0 A 0
5 0 0 NaN B 12
6 0 0 0 A D
7 1 1 1 B C
8 2 2 2 A 24
9 3 3 3 B 36
10 3 3.5 3.5 A D
11 NaN NaN NaN NaN
12 5 5 5 5 B 5
#D001とD002を1文字長の文字列として読み込み指定し、データの1行目をスキップ。
df2 = pd.read_csv('test2.txt', sep='\t', dtype={'D001':'S1','D002':'S1'}, names=['D001','D002','D003','D004','D005',u'データ6'], skiprows=1)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN
1 0 'a 5'| 'A' 'D'
2 ' 0 0 B NaN
3 0 0 0 A 0
4 0 0 NaN B 12
5 0 0 0 A D
6 1 1 1 B C
7 2 2 2 A 24
8 3 3 3 B 36
9 3 3.5 3.5 A D
10 NaN NaN NaN NaN
11 5 5 5 5 B 5
compression
ファイル形式を指定するパラメータ。デフォルトはinfer。4種類の値{‘gzip’, ‘bz2’, ‘infer’, None}が設定でき、圧縮ファイルもそのまま読み込めるということだと思います。なお、この場合engineをpythonにしないと動かないようです。手元に圧縮ソフトがなかったので検証は見送り。
dialect
マニュアルを見ると、string(文字列) or csv.Dialect instance(csvDialectのインスタンス)を渡せと書いてあります。csv.Dialectクラスは{delimiter, quotechar, escapechar, doublequote, skipinitialspace,lineterminator, quoting}をメンバに持つものであり、機能としてはそれぞれと変わらないものと思います。
import pandas as pd
import csv
dia = csv.excel()
dia.quoting = csv.QUOTE_NONE
dia.delimiter = '\t'
df2 = pd.read_csv('test2.txt', dialect=dia)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0 NaN 'a 5'| 'A' 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
4 0 NaN 0 NaN B 12
5 0 NaN 0 0 A D
6 1 NaN 1 1 B C
7 2 NaN 2 2 A 24
8 3 NaN 3 3 B 36
9 3.5 NaN 3.5 3.5 A D
10 NaN NaN NaN NaN NaN NaN
11 5 5 5 5 B 5
header
データ列の名称が記載されている行を指定するパラメータ。デフォルトは1行目(0)。存在する行数を指定すればその行の値がデータ列の名称として扱われるが、存在しない行(例えば-1)を設定した場合には1から順に連番が振られる。
import pandas as pd
#header行を指定することで任意の行をデータ列の名称にできる。
df = pd.read_csv('test2.txt', sep='\t', header=2)
Out[1]:
0 Unnamed: 1 'a 5'| 'A' 'D'
0 '0' NaN 0.0 0.0 B NaN
1 0 NaN 0.0 0.0 A 0
2 0 NaN 0.0 NaN B 12
3 0 NaN 0.0 0.0 A D
4 1 NaN 1.0 1.0 B C
5 2 NaN 2.0 2.0 A 24
6 3 NaN 3.0 3.0 B 36
7 3.5 NaN 3.5 3.5 A D
8 NaN NaN NaN NaN NaN NaN
9 5 5 5.0 5.0 B 5
index_col
データ行の名称が記載されている列を指定するパラメータ。デフォルトはNone。Noneの場合には1から順に自動で行数が振られる。
df = pd.read_csv(‘test2.txt’, sep=’\t’, header=1)
import pandas as pd
#index_col行を指定することで任意の列をデータ行の名称にできる。
df = pd.read_csv('test2.txt', sep='\t', index_col=0)
Out[1]:
D002 D003 D004 D005 データ6
D001
NaN NaN NaN NaN NaN NaN
0 NaN 'a 5'| 'A' 'D'
'0' NaN 0 0 B NaN
0 NaN 0 0 A 0
0 NaN 0 NaN B 12
0 NaN 0 0 A D
1 NaN 1 1 B C
2 NaN 2 2 A 24
3 NaN 3 3 B 36
3.5 NaN 3.5 3.5 A D
NaN NaN NaN NaN NaN NaN
5 5 5 5 B 5
prefix
headerがNoneのときに、列名の先頭に文字列を付加するパラメータ。デフォルトはNone。下例では、先頭にDがつくように指定することで、列名の頭にDがついていることが分かる。
import pandas as pd
#headerはNoneでなければならない。
df = pd.read_csv('test2.txt', sep='\t', prefix='D', header=None)
Out[1]:
D0 D1 D2 D3 D4 D5
0 D001 D002 D003 D004 D005 データ6
1 NaN NaN NaN NaN NaN NaN
2 0 NaN 'a 5'| 'A' 'D'
3 '0' NaN 0 0 B NaN
4 0 NaN 0 0 A 0
5 0 NaN 0 NaN B 12
6 0 NaN 0 0 A D
7 1 NaN 1 1 B C
8 2 NaN 2 2 A 24
9 3 NaN 3 3 B 36
10 3.5 NaN 3.5 3.5 A D
11 NaN NaN NaN NaN NaN NaN
12 5 5 5 5 B 5
na_values
NaNとして扱う値を指定するパラメータ。デフォルトはNone。下例では、AをNaNとするように指定している。
import pandas as pd
#AをNaNに指定。
df = pd.read_csv('test2.txt', sep='\t', na_values='A')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 NaN NaN 'a 5'| 'A' 'D'
2 '0' NaN NaN NaN B NaN
3 NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN B 12
5 NaN NaN NaN NaN NaN D
6 1 NaN 1 1 B C
7 2 NaN 2 2 NaN 24
8 3 NaN 3 3 B 36
9 3.5 NaN 3.5 3.5 NaN D
10 NaN NaN NaN NaN NaN NaN
11 5 5 5 5 B 5
true_values, false_values
trueとして扱う値、及びfalseとして扱う値を指定するパラメータ。デフォルトはNone。下例ではD005行目の要素を割り当てて真偽値として読み込ませている。NaNを除く列にある要素すべてに割り当てないと動作しない。
import pandas as pd
#AをNaNに指定。
df = pd.read_csv('test2.txt', sep='\t', true_values=['A','\'A\''], false_values='B')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 NaN NaN NaN NaN NaN NaN
1 0 NaN 'a 5'| True 'D'
2 '0' NaN 0 0 False NaN
3 0 NaN 0 0 True 0
4 0 NaN 0 NaN False 12
5 0 NaN 0 0 True D
6 1 NaN 1 1 False C
7 2 NaN 2 2 True 24
8 3 NaN 3 3 False 36
9 3.5 NaN 3.5 3.5 True D
10 NaN NaN NaN NaN NaN NaN
11 5 5 5 5 False 5
keep_default_na
空欄の要素をNaNとして扱うかを指定するパラメータ。デフォルトはTrue。Falseを指定すると下例のように空欄(長さ0の文字列)として扱われる。空欄のままにしておくと、pandasのplot等、さまざまな処理が使いにくくなる点には注意。
import pandas as pd
df = pd.read_csv('test2.txt', sep='\t', keep_default_na=False)
Out[1]:
D001 D002 D003 D004 D005 データ6
0
1 0 'a 5'| A 'D'
2 '0' 0 0 B
3 0 0 0 A 0
4 0 0 B 12
5 0 0 0 A D
6 1 1 1 B C
7 2 2 2 A 24
8 3 3 3 B 36
9 3.5 3.5 3.5 A D
10
11 5 5 5 5 B 5
parse_dates
日付として扱う列を指定するパラメータ。デフォルトはFalse。リスト形式で列番号を与えることで、複数の列を日付として処理したり、リスト内でさらにリスト表現することで、日付と時間に分かれている列を結合して日付として認識させることができる。列名を指定するためにはリストでなく辞書形式で渡せばよい。どのような形式のデータを日付として認識できるかは要調査。
import pandas as pd
#1列目に日付データ(8ケタ数字)を持たせておく。
df = pd.read_csv('test22.txt', sep='\t')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 19990206 NaN NaN NaN NaN NaN
1 19990206 'a 5'| A 'D' NaN
2 19990206 NaN 0 0 B NaN
3 19990206 0 0 A 0 NaN
4 19990206 0 NaN B 12 NaN
5 19990206 0 0 A D NaN
6 19990206 1 1 B C NaN
7 19990206 2 2 A 24 NaN
8 19990206 3 3 B 36 NaN
9 19990206 3.5 3.5 A D NaN
10 19990206 NaN NaN NaN NaN NaN
11 19990206 5 5 5 B 5
#1列目を日付に指定。
df2 = pd.read_csv('test22.txt', sep='\t', parse_dates=[0])
Out[1]:
D001 D002 D003 D004 D005 データ6
0 1999-02-06 NaN NaN NaN NaN NaN
1 1999-02-06 'a 5'| A 'D' NaN
2 1999-02-06 NaN 0 0 B NaN
3 1999-02-06 0 0 A 0 NaN
4 1999-02-06 0 NaN B 12 NaN
5 1999-02-06 0 0 A D NaN
6 1999-02-06 1 1 B C NaN
7 1999-02-06 2 2 A 24 NaN
8 1999-02-06 3 3 B 36 NaN
9 1999-02-06 3.5 3.5 A D NaN
10 1999-02-06 NaN NaN NaN NaN NaN
11 1999-02-06 5 5 5 B 5
#1,2列目を結合して日付に指定。(2行目が時間データでないのでうまく処理されない)
df3 = pd.read_csv('test22.txt', sep='\t', parse_dates=[[0,1]])
Out[1]:
D001_D002 D003 D004 D005 データ6
0 19990206 nan NaN NaN NaN NaN
1 19990206 'a 5'| A 'D' NaN
2 19990206 nan 0 0 B NaN
3 19990206 0 0 A 0 NaN
4 19990206 0 NaN B 12 NaN
5 19990206 0 0 A D NaN
6 19990206 1 1 B C NaN
7 19990206 2 2 A 24 NaN
8 19990206 3 3 B 36 NaN
9 19990206 3.5 3.5 A D NaN
10 19990206 nan NaN NaN NaN NaN
11 19990206 5 5 5 B 5
keep_date_col
parse_datesで指定した列を結合する際に、元の列も残すためのパラメータ。デフォルトはFalse。
import pandas as pd
df4 = pd.read_csv('test22.txt', sep='\t', parse_dates=[[0,1]], keep_date_col=True)
Out[1]:
D001_D002 D001 D002 D003 D004 D005 データ6
0 19990206 nan 19990206 NaN NaN NaN NaN NaN
1 19990206 'a 19990206 'a 5'| A 'D' NaN
2 19990206 nan 19990206 NaN 0 0 B NaN
3 19990206 0 19990206 0 0 A 0 NaN
4 19990206 0 19990206 0 NaN B 12 NaN
5 19990206 0 19990206 0 0 A D NaN
6 19990206 1 19990206 1 1 B C NaN
7 19990206 2 19990206 2 2 A 24 NaN
8 19990206 3 19990206 3 3 B 36 NaN
9 19990206 3.5 19990206 3.5 3.5 A D NaN
10 19990206 nan 19990206 NaN NaN NaN NaN NaN
11 19990206 5 19990206 5 5 5 B 5
date_parser
parse_datesで指定した列を結合する際に、関数を指定するためのパラメータ。デフォルトはFalse。
import pandas as pd
import pandas.io.date_converters as conv
#1列目に日付データ(8ケタ数字)、2列目に時間データを持たせておく。
df = pd.read_csv('test22.txt', sep='\t')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 19990206 10:00:00 NaN NaN NaN NaN
1 19990206 00:00:00 5'| A 'D' NaN
2 19990206 00:00:00 0 0 B NaN
3 19990206 00:00:00 0 A 0 NaN
4 19990206 00:00:00 NaN B 12 NaN
5 19990206 00:00:00 0 A D NaN
6 19990206 00:00:00 1 B C NaN
7 19990206 00:00:00 2 A 24 NaN
8 19990206 00:00:00 3 B 36 NaN
9 19990206 00:00:00 3.5 A D NaN
10 19990206 00:00:00 NaN NaN NaN NaN
11 19990206 00:00:00 5 5 B 5
#関数を割り当て
df2 = pd.read_csv('test22.txt', sep='\t', parse_dates=[[0,1]], date_parser=conv.parse_date_time)
Out[1]:
D001_D002 D003 D004 D005 データ6
0 1999-02-06 10:00:00 NaN NaN NaN NaN
1 1999-02-06 00:00:00 5'| A 'D' NaN
2 1999-02-06 00:00:00 0 0 B NaN
3 1999-02-06 00:00:00 0 A 0 NaN
4 1999-02-06 00:00:00 NaN B 12 NaN
5 1999-02-06 00:00:00 0 A D NaN
6 1999-02-06 00:00:00 1 B C NaN
7 1999-02-06 00:00:00 2 A 24 NaN
8 1999-02-06 00:00:00 3 B 36 NaN
9 1999-02-06 00:00:00 3.5 A D NaN
10 1999-02-06 00:00:00 NaN NaN NaN NaN
11 1999-02-06 00:00:00 5 5 B 5
dayfirst
日付データがDD/MMという形式で入っているデータを読み込む際に設定するパラメータ。デフォルトはFalse(つまり、MM/DD)として読み取る。
df2 = pd.read_csv('test22.txt', sep='\t', dayfirst=False, parse_dates=[0])
Out[1]:
D001 D002 D003 D004 D005 データ6
0 2000-06-02 10:00:00 NaN NaN NaN NaN
1 1999-02-06 00:00:00 5'| A 'D' NaN
2 1999-02-06 00:00:00 0 0 B NaN
3 1999-02-06 00:00:00 0 A 0 NaN
df2 = pd.read_csv('test22.txt', sep='\t', dayfirst=True, parse_dates=[0])
Out[1]:
D001 D002 D003 D004 D005 データ6
0 2000-02-06 10:00:00 NaN NaN NaN NaN
1 1999-02-06 00:00:00 5'| A 'D' NaN
2 1999-02-06 00:00:00 0 0 B NaN
3 1999-02-06 00:00:00 0 A 0 NaN
thousands
1000ごとの桁区切りの記号を指定するパラメータ。デフォルトはNone。この値を指定しておかないと例えば100,000はカンマを区切りとして100と000に分割される。
print(open('test23.txt').read())
Out[1]:
D001 D002
1,000,000 100
df = pd.read_csv('test23.txt', thousands=',', sep='\t')
Out[1]:
D001 D002
0 1000000 100
comment
コメント行を識別する記号を指定するパラメータ。デフォルトはNone。指定した値が初めにある行はコメントとみなしてスルーされる。
print(open('test23.txt').read())
Out[1]:
D001 D002
1,000,000 100
#test comment
df = pd.read_csv('test23.txt', thousands=',', sep='\t', comment='#')
Out[1]:
D001 D002
0 1000000 100
decimal
小数点を識別する記号を指定するパラメータ。デフォルトは「.」。
#小数点記号にカンマを割り当てたデータを用意。
print(open('test23.txt').read())
Out[1]:
D001 D002
0 100,000 100,1
import pandas as pd
df = pd.read_csv('test23.txt', sep='\t')
Out[1]:
D001 D002
0 100,000 100,1
df2 = pd.read_csv('test23.txt', sep='\t', decimal=',')
Out[1]:
D001 D002
0 100 100.1
nrows
読み込むデータの行数を指定するパラメータ。デフォルトはNone(全て)。
#読み込むデータを3行だけに指定。
import pandas as pd
df2 = pd.read_csv('test2.txt', sep='\t', nrows=3)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 19990206 NaN NaN NaN NaN NaN
1 19990206 NaN 'a 5'| A 'D'
2 '0' NaN 0 0 B NaN
iterator
読み込んだデータをpandasのDataFrame型ではなく、Textfilereader型で返すパラメータ。デフォルトはFalse。
import pandas as pd
df2 = pd.read_csv('test2.txt', sep='\t', iterator=True)
Out[1]:
<pandas.io.parsers.TextFileReader at 0x14d5a9e8>
chunksize
読み込んだデータをDataFrame型ではなく、Textfilereader型で返すパラメータ。iteratorと異なり、int型を引き数とし、指定した行数で区切って読み込む。
メモリに乗らないようなサイズの大きなデータを細かく読んでいくときに使う。
import pandas as pd
df2 = pd.read_csv('test2.txt', sep='\t', chunksize=4)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 19990206 NaN NaN NaN NaN NaN
1 19990206 NaN 'a 5'| A 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
D001 D002 D003 D004 D005 データ6
0 0 NaN 0 NaN B 12
1 0 NaN 0 0 A D
2 1 NaN 1 1 B C
3 2 NaN 2 2 A 24
D001 D002 D003 D004 D005 データ6
0 3.0 NaN 3.0 3.0 B 36
1 3.5 NaN 3.5 3.5 A D
2 NaN NaN NaN NaN NaN NaN
3 5.0 5 5.0 5.0 B 5
フッターとみなす行数を指定するパラメータ。フッターとみなしたデータは読み込まない。
import pandas as pd
df = pd.read_csv('test2.txt', sep='\t')
Out[1]:
D001 D002 D003 D004 D005 データ6
0 19990206 NaN NaN NaN NaN NaN
1 19990206 NaN 'a 5'| A 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
4 0 NaN 0 NaN B 12
5 0 NaN 0 0 A D
6 1 NaN 1 1 B C
7 2 NaN 2 2 A 24
8 3 NaN 3 3 B 36
9 3.5 NaN 3.5 3.5 A D
10 NaN NaN NaN NaN NaN NaN
11 5 5 5 5 B 5
df2 = pd.read_csv('test2.txt', sep='\t', skipfooter=4)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 19990206 NaN NaN NaN NaN NaN
1 19990206 NaN 'a 5'| A 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
4 0 NaN 0 NaN B 12
5 0 NaN 0 0 A D
6 1 NaN 1 1 B C
7 2 NaN 2 2 A 24
converters
変数の型を指定するパラメータ。dtypesで同じことができそうなので、使う機会は少ないかも。
import pandas as pd
#D005の型を文字列に指定。
df2 = pd.read_csv('test2.txt', sep='\t', converters={'D005':str})
Out[1]:
D001 D002 D003 D004 D005 データ6
0 19990206 NaN NaN NaN NaN
1 19990206 NaN 'a 5'| A 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
4 0 NaN 0 NaN B 12
5 0 NaN 0 0 A D
6 1 NaN 1 1 B C
7 2 NaN 2 2 A 24
8 3 NaN 3 3 B 36
9 3.5 NaN 3.5 3.5 A D
10 NaN NaN NaN NaN NaN
11 5 5 5 5 B 5
verbose
デフォルトはFalse。Trueを指定すると変換に要した時間が表示される模様。
import pandas as pd
#verboseをTrueに指定。
df2 = pd.read_csv('test2.txt', sep='\t', verbose=True)
Out[1]:
D001 D002 D003 D004 D005 データ6
0 19990206 NaN NaN NaN NaN NaN
1 19990206 NaN 'a 5'| A 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
4 0 NaN 0 NaN B 12
5 0 NaN 0 0 A D
6 1 NaN 1 1 B C
7 2 NaN 2 2 A 24
8 3 NaN 3 3 B 36
9 3.5 NaN 3.5 3.5 A D
10 NaN NaN NaN NaN NaN NaN
11 5 5 5 5 B 5
Tokenization took: 0.00 ms
Type conversion took: 0.00 ms
Parser memory cleanup took: 0.00 ms
encoding
文字コートを指定する変数。デフォルトはutf-8。日本語フォントで書かれている文字が文字化けする場合(utf-8で記述されていない場合)、’shift-jis’や’cp932’を指定することで文字化けを防止できることが多い。
import pandas as pd
#実際と違うコードを指定してみると、日本語部分が文字化け。
df2 = pd.read_csv('test2.txt', sep='\t', encoding='latin-1')
Out[1]:
D001 D002 D003 D004 D005 ãã¼ã¿6
0 19990206 NaN NaN NaN NaN NaN
1 19990206 NaN 'a 5'| A 'D'
2 '0' NaN 0 0 B NaN
3 0 NaN 0 0 A 0
4 0 NaN 0 NaN B 12
5 0 NaN 0 0 A D
6 1 NaN 1 1 B C
7 2 NaN 2 2 A 24
8 3 NaN 3 3 B 36
9 3.5 NaN 3.5 3.5 A D
10 NaN NaN NaN NaN NaN NaN
11 5 5 5 5 B 5
squeeze
データを単一列のデータとして読み込むパラメータ。デフォルトはFalse。
na_filter
データの空欄等をNaNとして処理するためのパラメータ。デフォルトはTrue。もしも、データ内にこれらの要素がない場合にはFalseを設定することで処理速度を向上させることができる。試してみると、確かにFalseのほうがちょっと早い。
%timeit pd.read_csv('test2.txt', na_filter=False, sep='\t')
1000 loops, best of 3: 760 µs per loop
%timeit pd.read_csv('test2.txt', na_filter=True, sep='\t')
1000 loops, best of 3: 818 µs per loop
usecols
データを読み込む列を指定するパラメータ。実行例は以下の通り。
df2 = pd.read_csv('test2.txt', usecols=[0], sep='\t')
Out[11]:
D001
0 19990206
1 19990206
2 '0'
3 0
4 0
5 0
6 1
7 2
8 3
9 3.5
10 NaN
11 5
mangle_dupe_cols
重複する列がある場合の処理を指定するパラメータ?変更しても効果なく調査中。
tupleize_cols
調査中。
error_bad_lines
項目数と一致しない行を見つけた時の処理を指定するパラメータ。デフォルトはTrueで、エラーを返す。Falseを指定した場合、その行を飛ばして読み込む。
warn_bad_lines
項目数と一致しない行を見つけた時に警告を返す。error_bad_linesがFalseであることが必要。
infer_datetime_format
時間の扱いにかかわるデータと思われるが、詳細不明。調査中。
skip_blank_lines
空欄の行の取り扱いを指定するパラメータ。Trueを指定するとスキップするようになる。
まとめ
read_csvでは、かなり細かい設定ができるようです。特によく使うのは、parse_dates、usecols、encodingといったところでしょうか。この関数は非常に使える関数だと思いますので、是非使い方をマスターしたいところです。