Pandasのread_csvの全引数を解説

概要

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

特に断りがない限り、使うデータは、パラメータの効果がわかり易くなるよう、タブ区切りだったり、文字列と空白と数値が混在していたりと、以下のようなちょっと癖のあるものにしています。
f:id:Rosyuku:20150827000216p:plain

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’を使うことで対策出来ます。詳細はこちら。

Python3.6のpandasで「Initializing from file failed」が起きた場合の対策


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

skipfooter

フッターとみなす行数を指定するパラメータ。フッターとみなしたデータは読み込まない。

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といったところでしょうか。この関数は非常に使える関数だと思いますので、是非使い方をマスターしたいところです。






コメントを残す

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

CAPTCHA