Pythonのpandasモジュールでcsvファイルを読み込む方法のまとめを実例と画像を用いてわかりやすく解説しています。
読み込む行・列の指定や除外、思っていた以上にできることが多いのでメモ。
基本的にはこれだけ押さえておけば十分に使いこなせます。
read_csvメソッドの主要オプション一覧
read_csvメソッドの主要オプション一覧
オプション | 使用例 | 内容 |
---|---|---|
sep | sep=’;’ | 分割(separate) |
delimiter | delimiter=’;’ | 分割(sepと同じ) |
header | header=1 | ヘッダー行の指定(デフォルトは推測、ない場合 header=None ※「N」は大文字) |
names | ①names=[‘AA’,’BB’,’CC’,,] ②names=’1234567′ | 列タイトルを付ける(ヘッダーがある場合は「header=0」と併用) |
index_col | index_col=0 | 行の見出し(index)となる列を指定 |
usecols | usecols=[1,2,5] | 読み込む行を指定。1行のみでもリスト形式で指定「usecols=[0]。列タイトルでも指定可能」 |
prefix | prefix=”行番号”, header=None | 行タイトルの接頭語を指定。例「prefix=’行番号’」なら行番号0、行番号1、、、となる。 hedar=Noneを指定したときのみ有効。 |
dtype | dtype=str | 型を指定して読み込み。適用できない場合はエラー(strをfloatで読み込むなど) |
skiprows | ①skiprows=5 ②skiprows=[1,3,6] | 冒頭で読み込まない行番号を指定。整数の場合は0から指定した整数まで。 |
skipfooter | skipfooter=2, engine=’python’, encoding=’utf_8′ | 下から除外する行数を指定。pythonで使うことを記述する必要あり。文字化けする場合は文字コードを指定。 |
nrows | nrows=5 | 何行目まで読み込むかを指定。 |
encoding | encoding=’shift_jis’ | ファイル読み込み時の文字コード指定 |
(compression) | compression=’zip’ | 圧縮ファイルを開く。現状、記述しなくても類推して開いてくれる。(逆にzipファイルにcompression=’gzip’を指定するとエラー) |
(skipinitialspace) | skipinitialspace=True | デリミタ(文字区切り)後に、先頭についている空白を削除する。現状、デフォルトで削除される仕様のよう |
デフォルトでのCSVファイルの読み込み
初めに、例えば以下のようなCSVの表データをread_csvでそのまま読み込んだ場合の、読み込み結果を記載しておきます。
▼列
・A列がindex(見出し)
・F列が空
・G列が文字と空白セル
▼行
・1行目が列のタイトル
・9行目が空
・10行目に数式エラー(#NUM!)がある
■読み込み結果
▼ポイント
・1列目に見出し列が追加(0からのindex番号)
・1行目にタイトル行が追加
- 空白のセルは「Unnamed:列番号」で補完
・空白セルはNaNになる。
・数式エラーは #NUM!のまま表示される。
※追加内容は再度ファイルに出力する場合に残る。(NaNは消える)
各列の属性(objectやfloat64)
各列の属性は次のようになります。
Unnamed: 0 object
列1 object
列2 float64
列3 object
列4 float64
Unnamed: 5 float64
列5 object
・日付:object型
・数値:float64型
└ 整数・少数どちらも
└ NaNは無視される
・関数エラーがある列:object型
・空の列:float64型
・テキスト:object型
└ テキストセルが1個あればobject型になる
読み込み結果をcsvとして出力した場合
utf8でcsvファイルとして出力した場合は以下のようになります。
・1行目と1列目に自動挿入された見出しは残る。
・NaNは空白行になる
元ファイルの空白行・列・セル
空白は「NaN」(空データ)として処理されます。
下記もNaNとして扱われます。
- 「”」
- 「#N/A」
- 「#N/A N/A」
- 「#NA」
- 「-1.#IND」
- 「-1.#QNAN」
- 「-NaN」
- 「-nan」
- 「1.#IND」
- 「1.#QNAN」
- 「」
- 「N/A」
- 「NA」
- 「NULL」
- 「NaN」
- 「n/a」
- 「nan」
- 「null」
ヘッダーの読み込みと指定
デフォルトの読み込み結果
読み込み時デフォルトは「類推」となっています。(Pandasが自動で割り当てる)
※基本的に最上部の行がヘッダーとして読み込まれます。
▼元ファイル
▼読み込み結果
import pandas as pd
df = pd.read_csv('~/desktop/test.csv')
df
pd.read_csvでデスクトップのtest.csvファイルを読み込み、dfで読み込んだ内容を表示しています。
ヘッダーがないファイルの読み込み
ヘッダーがないファイルの読み込むには、オプションでヘッダーがないことを指定します。
pd.read_csvの第2引数に以下を記述します。
header=None
※NoneのNは大文字です。(noneはエラーになります)
▼元ファイル(「デスクトップのtest2.csv」とする)
▼読み込みファイルpd.read_csv('~/desktop/test2.csv' ,header=None)
import pandas as pd
df = pd.read_csv('~/desktop/test2.csv' ,header=None)
df
指定がない場合(デフォルト)
ヘッダーのないファイルを読み込むときにheader=Noneを指定しないと、一番上の行がヘッダーとして読み込まれてしまいます。
df2 = pd.read_csv('~/desktop/test2.csv')
ヘッダーとなる行を指定する方法
ヘッダーとなる行を指定するには、オプションで header=整数
を記述します。
このとき、指定した行より上は読み込まれません。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv' ,header=6)
df
指定がない場合(デフォルト)
ヘッダー名を指定して読み込む方法
読み込み時にヘッダーの名前を指定して読み込むことができます。方法オプションでnames=
を記述します。
オプションの値の書き方は2種類あります。
- 連続した文字列
- list形式
実例:7列あるデータ
(1)連続した文字列で指定
▼例1:names='123345'
の場合
7列あるデータに対して5つの文字しか指定しない場合、不足分の前方2列のヘッダー名は空白になります。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv' ,names='12345')
df
先頭の足りない2列分が空白になる。
▼例2:names='abcdefghi'
の場合
7列あるデータに対して9つの文字を指定すると、過剰な分がNaNのデータをもった列として追加されます。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv' ,names='abcdefghi')
df
余剰な2列は中身が空(NaN)の列となる。
▼例3:names='aaabbbccc'
重複する場合はエラー
指定する列名が重複する場合はエラーになります。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv' ,names='aaabbbccc')
df
#出力
# ValueError: Duplicate names are not allowed.
(2)list形式で指定
ヘッダー名を1語ではなく単語を指定したい場合は配列(list)を使います。
▼例1:names=[‘aaa’,’bbb’,’ccc’,’ddd’,’eee’,’fff’]の場合
import pandas as pd
df = pd.read_csv('~/desktop/test.csv' ,names=['aaa','bbb','ccc','ddd','eee','fff'])
df
▼例2:names=[‘aaa’,’bbb’,’aaa’,’ddd’] 重複はエラー
指定する列名が重複する場合はエラーになります。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv' ,names=['aaa','bbb','aaa','ddd'])
df
ヘッダー名に共通の接頭語を指定する
prefixというオプションを使うとヘッダー名に共通の接頭語を指定することができます。
prefix=’文字列’, header=None
└ header=Noneの場合のみ有効(ないときは無視される)
└ 指定した文字列に列番号がつく。
prefix=”xxx” を指定して読み込むと以下のようになります。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', prefix="XXX", header=None)
df
見出し列(インデックス)の指定
これまではヘッダーとなる行の設定でした。同様に、見出しとなる列(インデックス)も指定することができます。
見出し列(インデックス)の指定は、オプションにindex_col=整数
を記述します。デフォルトは自動でインデックス番号が振られた列が追加されます。
例:index_col=0 とした場合
index_col=0とすれば、一番左端の列が見出しとして読み込まれます。
python
import pandas as pd
df = pd.read_csv('~/desktop/test.csv' ,index_col=0)
df
指定なし(デフォルト)の場合
読み込む列を指定する
表を読み込むときに、列番号または列名で指定することができます。(指定した列しか読み込まない)
- 列番号で指定
- 列名で指定
▼元のCSVファイルは以下を使用
import pandas as pd
df = pd.read_csv('~/desktop/test.csv')
df
列番号で指定する方法
オプションにusecols=[]
を記述
└ リスト型
└ 指定が1列の場合でも[]で記述複数列指定
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', usecols=[0,3,6])
df
▼1列の場合(例 0番目の列のみ)
usecols=[0]
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', usecols=[0])
df
▼list型でない場合はエラー
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', usecols=0)
df
#出力
# ValueError: 'usecols' must either be list-like of all strings, all unicode, all integers or a callable.
列名で指定する方法
列名を指定して抜き出すことも可能です。
▼例:usecols=[‘列1’,’列4’]
└ 列1と列4を指定。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', usecols=['列1','列4'])
df
▼読み込み時に列名をつけて、その名前で抜き出すことも可能です。
例:
・header=0
・names=’ABCDEFG’
・usecols=[‘A’,’C’]
header=0で既存のヘッダーの設定をリセットし、namesでヘッダーに名前をつけ、usecolsで使う列名を指定しています。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', header=0, names='ABCDEFG' ,usecols=['A','C'])
df
行の読み込み
行を読み込む方法は以下の4つがあります。
- 先頭から読み込む行数を指定
- 先頭から除外する行数を指定
- 指定した行を除外
- 末尾から除外する行数を指定
先頭から読み込む行数を指定する方法
オプションにnrows=整数を記述します。
行数が膨大にある時に、中身を確認する場合などに便利です。
▼例:nrows=3
上から3行目まで読み込む。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', nrows=3)
df
先頭から除外する行数を指定する方法
オプションに
skiprows=整数 を記述します。
▼例:skiprows=6
上から6行目までスキップ。
ヘッダーの指定がなければ、6行目がヘッダーになる。
※「skiprows=0」はスキップなし。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', skiprows=6)
df
指定した行を除外する方法
オプションにskiprows=[整数]を記述します。
▼例:skiprows=[2,3,6,7,8]
上から2,3,6,7,8行目をスキップ。
※1行のみスキップする場合も[ ]を使う
└「skipworw=[6]」:6行目をスキップ
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', skiprows=[2,3,6,7,8])
df
末尾から除外する行数を指定
オプションにskipfooter=整数, engine=’python’を記述します。
※文字化けする場合は文字コードを指定してください。
例:encoding=’utf_8′
▼例:skipfooter=6, engine=’python’, encoding=’utf_8’
下から6行目までをスキップ。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', skipfooter=6, engine='python', encoding='utf_8')
df
▼文字コードの指定がない場合
文字コードの指定がない場合は文字化けすることがあります。
skipfooter=6, engine=’python’
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', skipfooter=6, engine='python')
df
日本語が文字化けしています。
▼pythonの指定がない場合
engine=’python’の指定がない場合はエラーが発生します。
skipfooter=6
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', skipfooter=6)
df
#出力
# <ipython-input-81-77b6fdc5c66e>:2: ParserWarning: Falling back to the 'python' engine
#because the 'c' engine does not support skipfooter;
#you can avoid this warning by specifying engine='python'.
エラーで「engine=’python’」を記述する指示があります。
型を指定して読み込む
オプションでdtype=型を記述します。
変更できない場合はエラーになります。
※読み込んだ表のタイプを見る方法に「dtypes」メソッドがあります。
「dtype」と「dtypes」は複数形か単数形かで処理が異なるので注意してください。
▼dtype=strで文字列に変換し、.dtypes(dtypesメソッド)で型を確認する例。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv', dtype=str)
df.dtypes
#出力
Unnamed: 0 object
列1 object
列2 object
列3 object
列4 object
Unnamed: 5 object
列5 object
dtype: object
▼デフォルト
import pandas as pd
df = pd.read_csv('~/desktop/test.csv')
df.dtypes
#出力
Unnamed: 0 object
列1 object
列2 float64
列3 object
列4 float64
Unnamed: 5 float64
列5 object
dtype: object
▼文字列をfloatに変換
文字列をfloatに変換しようとするとエラーになる。
import pandas as pd
df = pd.read_csv('~/desktop/test.csv' ,dtype=float)
df.dtypes
#出力
# ValueError: could not convert string to float
WEB上のファイルの読み込み
WEB上のCSVファイルを読み込むこともできます。
pd.read_csv(‘URL’, encoding=’文字コード’)
※文字化けする場合や、文字コードが異なるというエラーが出た場合は「encoding=’文字コード’」を指定してください。
▼例:政府の全国の都道府県別男女別人口の統計データを読み込み
・参考ページ:e-Start
import pandas as pd
dfurl = pd.read_csv('https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031524010&fileKind=1', encoding='shift_jis')
dfurl
文字コードの指定がない場合はエラーになる
encoding=’shift_jis’など文字コードの指定がない場合はエラーになります。
import pandas as pd
dfurl = pd.read_csv('https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031524010&fileKind=1')
dfurl
#出力
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte
圧縮ファイルの読み込み
特に指定せずともzipなどの圧縮ファイルを読み込むことができます。
読み込み可能な圧縮形式:‘gzip’, ‘bz2’, ‘zip’, ‘xz’ です。
デフォルト: compression=infer が適用されていて、圧縮形式を自動で類推して読み込んでくれます。
※複数ファイルが圧縮されている場合は読み込めない。
※PWが設定されている場合は読み込めない。
▼例:デスクトップ上のzipファイル、test.zipを読み込む
import pandas as pd
df = pd.read_csv('~/desktop/test.zip')
df
上記はcompression=’zip’と同じことが行われています。
import pandas as pd
df = pd.read_csv('~/desktop/test.zip', compression='zip')
df
圧縮ファイルの読み込みでエラーになる場合
圧縮形式の指定が間違っているとエラー
import pandas as pd
df = pd.read_csv('~/desktop/test.zip', compression='gzip')
df
#出力
# BadGzipFile: Not a gzipped file (b'PK')
2つ以上のファイルが圧縮されている場合もエラー
import pandas as pd
df = pd.read_csv('~/desktop/test.zip', compression='gzip')
df
#出力
# BadGzipFile: Not a gzipped file (b'PK')
PWが設定してある場合もエラー
import pandas as pd
df = pd.read_csv('~/desktop/test.zip')
df
#出力
# RuntimeError: File 'test.csv' is encrypted, password required for extraction
区切り文字を指定して読み込み
CSVファイルのデータがセルではなく「,」など特定の記号で区切られている場合に、区切り文字を指定して表データとして読み込むことができます。
sep=’区切り文字’
└「delimiter=’区切り文字’」も同じ処理になります。
▼例:読み込むファイル
1つのセルに複数のデータが入っている。
└ 「@」で区切ってあるデータ
└ 「;」で区切ってあるデータ
※2文字指定はできない(listは使えない)
※同じオプションを繰り返せない
※delimiterとsepの併用はできない。
└ delimiterが優先される。
デフォルトの読み込み結果
import pandas as pd
df = pd.read_csv('~/desktop/test2.csv')
df
sep=’@’(「@」で区切る)
import pandas as pd
df = pd.read_csv('~/desktop/test2.csv', sep='@')
df
delimita=’@’(「@」で区切る)
import pandas as pd
df = pd.read_csv('~/desktop/test2.csv', delimiter='@')
df
sep=’;’ (「;」で区切る)
import pandas as pd
df = pd.read_csv('~/desktop/test2.csv', sep=';')
df
区切り文字の指定でエラーになるパターン
オプションの繰り返しはできない
sep=’;’, sep=’@’のように、同じオプションを複数回指定した場合はエラーになります。
import pandas as pd
df = pd.read_csv('~/desktop/test2.csv', sep=';', sep='@')
df
#出力
# SyntaxError: keyword argument repeated
2文字指定はできない(listは使えない)
import pandas as pd
df = pd.read_csv('~/desktop/test2.csv', sep=[';','@'])
df
#出力
# TypeError: unhashable type: 'list'
2delimiterとsepの併用はできない。
delimiterが優先されます。