ITや趣味など気軽に投稿しています。

【Pandas】CSVファイルをデータフレームとして読み込む

今回は、CSVファイルをPandasデータフレームとして読み込む方法を紹介します。

CSV形式でデータ保管されているケースも少なくないはず。
今回はCSVファイルをPandasで読み込む方法を紹介する。

Pandasバージョン

本記事は、Pandas2.2.3の情報を基に執筆しています。

import pandas as pd
print(pd.__version__)

>>
2.2.3

pd.read_csv()

CSVファイルの読み込みにはpd.read_csv()を用います。必須の引数として、読み込むファイルのパス(またはバッファ)を拡張子付きで指定します。相対パスでも絶対パスでも問題ありません。

pandas.read_csv(filepath_or_buffer*sep=<no_default>delimiter=Noneheader=’infer’names=<no_default>index_col=Noneusecols=Nonedtype=Noneengine=Noneconverters=Nonetrue_values=Nonefalse_values=Noneskipinitialspace=Falseskiprows=Noneskipfooter=0nrows=Nonena_values=Nonekeep_default_na=Truena_filter=Trueverbose=<no_default>skip_blank_lines=Trueparse_dates=Noneinfer_datetime_format=<no_default>keep_date_col=<no_default>date_parser=<no_default>date_format=Nonedayfirst=Falsecache_dates=Trueiterator=Falsechunksize=Nonecompression=’infer’thousands=Nonedecimal=’.’lineterminator=Nonequotechar='”‘quoting=0doublequote=Trueescapechar=Nonecomment=Noneencoding=Noneencoding_errors=’strict’dialect=Noneon_bad_lines=’error’delim_whitespace=<no_default>low_memory=Truememory_map=Falsefloat_precision=Nonestorage_options=Nonedtype_backend=<no_default>)

以下のような形式で指定します。

import pandas as pd

df = pd.read_csv("input/apple_stock.csv")
df = pd.read_csv("input/apple_stock.csv")

引数一覧

引数必須説明
filepath_or_buffer読み込むファイルのパスまたはバッファ。
sep区切り文字。デフォルトは’,'(カンマ)。
delimitersepのエイリアス
headerカラムとして利用する行番号を指定する。デフォルトは0。
headerがない場合はNoneを指定する。
namesカラム名を別途指定する場合、配列で指定する。
index_colインデックスとして使用する列を指定する。デフォルトは指定なく、連番が割り当てられる。
usecols読み込むカラムを指定する。
dtypeデータの型を指定する。任意の型を指定すると、データフレーム全体がその型になる。カラムごとに辞書形式で指定も可能。
engine‘openpyxl’, ‘calamine’, ‘odf’, ‘pyxlsb’, ‘xlrd’のいずれかを指定。
デフォルトはNone。
converters特定の列に関数処理を実行する。{列名:処理}の辞書形式で指定する。
true_valuesTrueの値について、別のワードを使用したい場合に指定。’Yes’など。
false_valuesFalseの値について、別のワードを使用したい場合に指定。’No’など。
skipinitialspace区切り文字の後ろのスペースをスキップするか。
デフォルトはFalse(スキップしない)。
skiprows先頭からスキップしたい行を指定する。配列、整数またはcallable関数で指定可能。
skipfooter読み込みをスキップする末尾の行数。
nrows読み込む行数を整数で指定する。
na_valuesNA/NANについて、別のワードを使用したい場合に指定。
keep_default_naFalseにすると、NAなどが欠損値として扱われなくなる。
na_valuesで指定した値は対象外。
na_filterFalseにすると、全ての値を欠損値として扱わずに読み込む。
verbose数値以外の列の欠損値の数を表示する。
skip_blank_linesTrueにすると、すべてブランクの行を読み込まない。
デフォルトはTrue。
parse_dates指定の列をdatetime64[ns]に変換する。
デフォルトはFalse。
infer_datetime_format(非推奨)parse_datesが有効かつ本引数をTrueにした場合、データ内の日付及び時刻文字列の型を自動で推測する。
keep_date_colparse_datesで日付変換した際、元のカラムを残すかを指定する。
デフォルトは残さない。
date_parser(非推奨)文字列のカラムをdatetime64[ns]に変換する。2.0.0以降はdate_formatの利用を推奨。
date_format(非推奨)parse_datesと組み合わせて使用し、日付の変換フォーマットを指定する。
dayfirst日付をDD/MM/YYYY形式で読み込むかどうか。デフォルトはFalse。
※デフォルトはMM/DD/YYYYで読み込まれる
cache_dates日付の変換結果をキャッシュするかどうか。デフォルトはTrue。
※重複した日付データが複数ある場合、キャッシュを利用することで変換処理が速くなる
iteratorファイルを分割して読み込むかどうか。デフォルトはFalse。
Trueとした場合、データフレームではなくTextFileReader(イテレータ)が返される。
※chunksizeと併用
chunksizeTextFileReaderと組み合わせ、一度に読み込む行数を整数で指定する。
※for文を用いて順次データを読み込む場合等に使用する
compression読み込むファイルが圧縮ファイルの場合、フォーマットを指定する。
thousands文字列を数値に変換する際の区切り文字を指定する。Excelで文字列で保存されている数字のみに適用される。数値で保存されている場合、無効。
decimal文字列を数値に変換する際の小数点となる文字を指定する。
lineterminator行末を表す文字(1文字)を指定する。
quotecharデータに引用符が含まれる場合、その文字を指定する。
指定した引用符自体は読み込まれない。
quoting引用符の取り扱いを指定する。
doublequote連続する引用符を、1つの引用とみなすかどうか。
デフォルトはTrue。
escapecharエスケープする文字(1文字)を指定する。
デフォルトはNone。
comment文字列のカラムについて、指定した文字列から始まるセルを欠損値として扱う。
encoding読み込み時の文字コードを指定する。
デフォルトは’utf-8’。
encoding_errorsエンコード時にエラーが発生した場合の取り扱いを指定する。
デフォルトは’strict’。
dialect区切り文字や引用符有無といった表記ルールを指定する。
on_bad_lines読み込みエラーが発生する行があった場合の処理を指定する。
デフォルトは’error’。
delim_whitespace(非推奨)空白文字(' ''\t')をセパレータとして使用するかどうか。デフォルトはFalse。
low_memoryメモリ消費量を抑えるため、内部的にチャンク単位で処理をするかどうか。デフォルトはTrue。
※チャンク単位の処理では、型推論が厳格に行えない可能性がある
memory_mapfilepath_or_bufferにファイルが指定されている場合、ファイルオブジェクトを直接メモリにマッピングするかどうか。
デフォルトはFalse。
※I/Oオーバヘッドが削減され、パフォーマンス向上が期待できる
float_precision浮動小数点のコンバータを指定する。デフォルトはNone。
storage_optionsS3などリモートのファイルへのアクセスに必要な情報を辞書形式で指定する。
dtype_backendバックエンドのデータタイプ。
‘numpy_nullable’, ‘pyarrow’のいずれかを指定。
デフォルトは‘numpy_nullable’

pd.read_excel()よりも引数が多いですね!?

ひとえにCSVといっても、そのフォーマットはまちまちだったりする。
色々なフォーマットに対応できるようにオプションをつけていった結果、この引数の数になっているのだろう。

以降は、よく使う引数をいくつか紹介しよう。

基本引数

sep

区切り文字を指定します。デフォルトは’,'(カンマ)です。

ところでCSVとは「Comma Separated Values」の略で、カンマで区切られたテキスト形式を指します。つまり、区切り文字を指定できるということは、CSV以外の形式でも読み込みができるということを意味します。

例えば、以下のようなタブ区切りのファイル(TSV)を読み込みます。

apple_stock.tsv
df = pd.read_csv("input/apple_stock.tsv", sep="\t")
df = pd.read_csv("input/apple_stock.tsv", sep="\t")

問題なく読み込むことができます。

header

ヘッダー行を指定します。

整数で行番号指定すると、当該行をヘッダーとして読み込みます。デフォルトではheader=0と同様の動きをします。

df = pd.read_csv("input/apple_stock.csv", sep=",", header=0)
df = pd.read_csv("input/apple_stock.csv", sep=",", header=0)

複数行をヘッダーとして読み込みたい場合は、リスト形式で行番後を複数指定します。

df = pd.read_csv("input/apple_stock.csv", sep=",", header=[0, 1])
df = pd.read_csv("input/apple_stock.csv", sep=",", header=[0, 1])

ヘッダーとして読み込む行がない場合は、Noneを指定します。

df = pd.read_csv("input/apple_stock.csv", sep=",", header=None)

names

データフレームの列名として使用する値をリスト形式で指定します。

cols = ["Date_renemed", "Open_renemed", "High_renemed", "Low_renemed", "Close_renemed", "Volume_renemed", "Adj_Close_renemed"]
df = pd.read_csv("input/apple_stock.csv", sep=",", names=cols)
df = pd.read_csv("input/apple_stock.csv", sep=",", names=cols)

index_col

インデックスに割り当てる列を指定することができます。列番号(左端が0)または列名を指定します。

df = pd.read_csv("input/apple_stock.csv", index_col=3)
df = pd.read_csv("input/apple_stock.csv", index_col="Open")
df = pd.read_csv("input/apple_stock.csv", index_col="Open")

usecols

読み込み対象の列を指定します。指定しない場合、すべての列が読み込まれます。

列の指定は、列番号の配列または列名の配列で指定します。列番号と列名の混合配列はErrorとなります。

df = pd.read_csv("input/apple_stock.csv", usecols=[0, 1, 4])
df = pd.read_csv("input/apple_stock.csv", usecols=["Date", "High", "Close"])
df = pd.read_csv("input/apple_stock.csv", usecols=["Date", "High", "Close"])

dtype

読み込む列の型を指定します。データフレーム全体の一括型指定または、辞書形式で列ごとに型を指定します。

データフレーム全体を数値や日付といった型に一括変換しようとした場合、文字列等変換できないデータが混在しているとエラーになるので、注意してください。

#データフレーム全体を一括で型指定
df = pd.read_csv("input/apple_stock.csv", dtype=object)
df.dtypes

>>
Date         object
High         object
Low          object
Open         object
Close        object
Volume       object
Adj Close    object
dtype: object

列ごとに型指定する場合、辞書形式で指定します。指定しなかった列は、デフォルトで読み込まれた型が適用されます。

#列ごとに型指定
df = pd.read_csv("input/apple_stock.csv", dtype={"Date": str, "Open": float, "High": object, "Low": float, "Close": float})
df.dtypes

>>
Date          object
High          object
Low          float64
Open         float64
Close        float64
Volume       float64
Adj Close    float64
dtype: object

skiprows

読み込みをスキップする行を行番号のリストで指定します。

callable関数で指定する場合、関数はインデックス番号に対して適用されます。lambda x: x % 2 == 0とした場合、偶数行の読み込みがスキップされ奇数行のみが読み込まれます。

df = pd.read_csv("input/apple_stock.csv", skiprows=[0,2])
#callable関数
df = pd.read_csv("input/apple_stock.csv", skiprows=lambda x: x % 2 == 0)

skipfooter

読み込みをスキップする末尾の行数を整数で指定します。

engine=’c’を指定している場合、本引数は無効となります。

df = pd.read_csv("input/apple_stock.csv", skipfooter=5)

nrows

読み込む行数を整数で指定します。

df = pd.read_csv("input/apple_stock.csv", nrows=5)
df = pd.read_csv("input/apple_stock.csv", nrows=5)

欠損値(NA/NaN)の取扱い

na_values

欠損値(NA/NaN)として扱いたい値を指定します。デフォルトでは以下値を欠損値として扱いますが、それ以外の値を指定したい場合に本引数を用います。

デフォルトで欠損値として扱われる値
“ “, “#N/A”, “#N/A N/A”, “#NA”, “-1.#IND”, “-1.#QNAN”, “-NaN”, “-nan”, “1.#IND”, “1.#QNAN”, “<NA>”, “N/A”, “NA”, “NULL”, “NaN”, “None”, “n/a”, “nan”, “null “

例えば、以下のようなCSVを想定します。1行目に#N/Aと-nanが含まれており、読み込むと欠損値として扱われます。

apple_stock.csv(欠損値あり)
apple_stock.csv(欠損値あり)読み込み後

同じく1行目に”欠損値”という値があり、これも欠損値として扱いたい場合は以下のように指定します。

df = pd.read_csv("input/apple_stock.csv", na_values="欠損値")
df = pd.read_csv("input/apple_stock.csv", na_values="欠損値")

na_filter

欠損値を欠損値として扱うかを指定します。デフォルトはTrueです。

Falseにすると、”NaN”や”NULL”なども全て文字列として読み込まれます。

df = pd.read_csv("input/apple_stock.csv", na_filter=False)
df = pd.read_csv("input/apple_stock.csv", na_filter=False)

日付・時刻の取扱い

デフォルトでは、どのようなフォーマットの日付・時刻データも日付型として読み込まれません。

以下のようなデータのCSVで検証します。

df = pd.read_csv("input/date.csv")
df = pd.read_csv("input/date.csv")

型を確認すると、文字列または数値型となっています。

df.dtypes

>>
Date        object
DayFirst    object
iso8601     object
Year         int64
Month        int64
Day          int64
Time        object
JapanFormat    object
dtype: object

parse_dates

日付型に変換するカラムを指定します。デフォルトはNoneです。

指定したカラムはnumpy.datetime64に変換されます。なお、日付型に変換できないカラムを指定すると、変換されずにスルーされます。

df = pd.read_csv("input/date.csv", parse_dates=["Date"])
df.dtypes

>>
Date        datetime64[ns]
DayFirst            object
iso8601             object
Year                 int64
Month                int64
Day                  int64
Time                object
JapanFormat         object
dtype: object

複数カラムの指定も可能です。

df = pd.read_csv("input/date.csv", parse_dates=["Date", "iso8601"])
df.dtypes

>>
Date        datetime64[ns]
DayFirst            object
iso8601     datetime64[ns]
Year                 int64
Month                int64
Day                  int64
Time                object
JapanFormat         object
dtype: object

2重リストとして複数カラムを指定すると、1つの日付データとみなして変換することができます。

下記の場合、Year、Month、Dayの3列がYear_Month_Dayというカラムにまとめられています。

df = pd.read_csv("input/date.csv", parse_dates=[["Year", "Month", "Day"]])
df = pd.read_csv("input/date.csv", parse_dates=[["Year", "Month", "Day"]])

keep_date_col

parse_datesで日付型に変換する際、変換前のカラムを残すかを指定します。デフォルトでは元のカラムは残りません(False)。

keep_date_col=Trueとすることで、新規に生成された列とは別に、元のカラムも残ります。

以下の場合、”Year”, “Month”, “Day”もデータとして保持されたままになります。

df = pd.read_csv("input/date.csv", parse_dates=[["Year", "Month", "Day"]], keep_date_col=True)
df = pd.read_csv("input/date.csv", parse_dates=[["Year", "Month", "Day"]], keep_date_col=True)

date_format

日付型に変換するインプットデータのフォーマットを指定します。任意の文字列でフォーマットを指定できるほか、”ISO8601″や”mixed”を指定可能です。

“ISO8601″はISO8601フォーマットとして読み込み、変換します。”mixed”は各値ごとにフォーマットを推定しますが、公式では推奨していません。

以下では、”JapanFormat”列を日付型として読み込みます。年月日等日本語フォーマットも対応可能です。

df = pd.read_csv("input/date.csv", parse_dates=["JapanFormat"], date_format="%Y年%m月%d日")
df = pd.read_csv("input/date.csv", parse_dates=["JapanFormat"], date_format="%Y年%m月%d日")

dayfirst

イギリス式の日付表記DD/MM/YYYYのフォーマットに対応するための引数です。デフォルトではMM/DD/YYYYとして読み込まれるため、日付と月が反対に読み込まれてしまいます。

dayfirst=Trueとすることで、DD/MM/YYYYの形式で日付型に変換することができます。

まずはデフォルトの状態でDayFirst列をparse_dateしてみます。

df = pd.read_csv("input/date.csv", parse_dates=["DayFirst"])
df = pd.read_csv("input/date.csv", parse_dates=["DayFirst"])

本来2015-11-3…としたいところですが、月と日が入れ替わってしまっています。

続いて、dayfirst=Trueを指定します。

df = pd.read_csv("input/date.csv", parse_dates=["DayFirst"], dayfirst=True)
df = pd.read_csv("input/date.csv", parse_dates=["DayFirst"], dayfirst=True)

DD/MM/YYYYのフォーマットに変換できます。

イテレーション

iterator/chunksize

iterator及びchunksizeは、CSVファイルを分割して読み込むための引数です。DB操作でいうところのページング処理にあたります。

iterator=Trueとすると、ファイルを読み込んだデータフレームではなく、TextFileReaderというイテレータが返されます。

TFReader = pd.read_csv("input/apple_stock.csv", iterator=True)
type(TFReader)

>>
pandas.io.parsers.readers.TextFileReader

ループ処理を用いて、イテレータからデータフレームを順次取得します。一度に取得する行数はchunksizeで指定します。以下は、apple_stock.csvから2行ずつ取得する例です。

TFReader = pd.read_csv("input/apple_stock.csv", iterator=True, chunksize=2, usecols=[0, 1, 2])
for chunk in TFReader:
    print(chunk)
    print("=====")

>>
         Date         High          Low
0  2015-11-23  2095.610107          NaN
1  2015-11-24  2094.120117  2070.290039
=====
         Date    High          Low
2  2015-11-25  2093.0  2086.300049
3  2015-11-26  2093.0  2086.300049
=====
         Date         High          Low
4  2015-11-27  2093.290039  2084.129883
5  2015-11-28  2093.290039  2084.129883
=====
         Date         High          Low
6  2015-11-29  2093.290039  2084.129883
7  2015-11-30  2093.810059  2080.409912
=====

数値の取扱い

数値データを取り扱う引数を紹介します。検証は以下のCSVファイルを使用します。

df = pd.read_csv("input/numbers.csv")
df = pd.read_csv("input/numbers.csv")

thousands

数値データに区切り文字が含まれる場合、その文字を指定することで数値として読み込むことができます。

以下では、thousands列が数値型として読み込めています。

df = pd.read_csv("input/numbers.csv", thousands=",")
df = pd.read_csv("input/numbers.csv", thousands=",")

decimal

小数点を意味する文字を指定します。デフォルトはピリオド(.)です。

ピリオド以外の場合があるのか?と疑問でしたが、どうやらフランスやドイツなどでは小数点にカンマが使われているみたいです。

以下では、decimal列のカンマが小数点として読み込めています。

df = pd.read_csv("input/numbers.csv", decimal=",")

ファイルの体裁に関する取扱い

lineterminator

改行コードを任意の1文字で指定します。engine=’c’でのみ有効な引数で、それ以外のエンジンを明示的に指定している場合はエラーとなります。

df = pd.read_csv("input/apple_stock.csv", lineterminator='\r')

quotechar

引用符として使用する文字を指定します。値をシングルクォートなどで囲っているデータを処理する際に使用する引数です。

デフォルトはダブルクォートを引用符とみなすため、ダブルクォートは値として読み込まれません。

apple_stock.csv(ダブルクォーテーション)
df = pd.read_csv("input/apple_stock.csv")
df = pd.read_csv("input/apple_stock.csv")

次に、引用符をシングルクォートにしたCSVファイルを用意します。

apple_stock.csv(シングルクォート)

読み込んだデータフレームが以下です。

df = pd.read_csv("input/apple_stock.csv")

シングルクォートも値の一部として読み込まれています。

quotecharにシングルクォートを指定すると、正しく値を読み込むことができます。

df = pd.read_csv("input/apple_stock.csv", quotechar="'")

quoting

引用符の取扱いを指定する引数で、以下の4つを指定可能です。対応する整数を指定する必要があります。

デフォルトはcsv.QUOTE_MINIMALで、ダブルクォートを引用符と認識します。

csvQUOTE_NONEを指定すると、ダブルクォートも引用符として認識しなくなります。

# csv.QUOTE_NONE
df = pd.read_csv("input/apple_stock.csv", quoting=3)
df = pd.read_csv("input/apple_stock.csv", quoting=3)

doublequote

連続するクォートを、1つのクォートとみなすかどうかを指定します。デフォルトはTrueです。クォートとはquotecharで指定した文字を指し、デフォルトはダブルクォートが対象です。

本引数は、quotecharが指定されており、且つquotingがQUOTE_NONE以外である場合に有効です。

以下のようなCSVを用意します。ヘッダを除いた1行目に、連続したダブルクォートで囲った値を仕込みます(””-nan””など)ダブルクォートは3つ連続していますが、1つは引用符として使われるものです。

まずはデフォルト(True)の状態で読み込みます。

df = pd.read_csv("input/apple_stock.csv")
df = pd.read_csv("input/apple_stock.csv", doublequote=True)

値に含まれるダブルクォートは、2つで1つとして認識されています。

続いて、doublequote=Falseで読み込みます。

df = pd.read_csv("input/apple_stock.csv", doublequote=False)

例えば”””-nan”””の場合、””と”-nan”””で別の値として読み込まれるようです(”-nan”””のみが残っています)

encoding

CSVファイルの文字コード(utf-8など)を指定します。デフォルトはNoneです。

指定できる文字コードはPython標準に準拠します。

Windowsの場合は、Shift_JISを拡張したCP932などがよく用いられます。

df = pd.read_csv("input/apple_stock.csv", encoding="utf-8")
df = pd.read_csv("input/apple_stock.csv", encoding="cp932")

エラーハンドリング

encoding_errors

文字コード変換時にエラーが発生した場合のハンドリングを指定します。以下の5つから指定でき、デフォルトは’strict’です。

意味
‘strict’変換できない文字があると、UnicodeErrorを送出する。
‘ignore’変換できない値は無視される。
‘replace’変換できない文字は�(U+FFFD)に変換される。
‘backslashreplace’変換できない文字はバックスラッシュのエスケープシーケンス(\xhh、 \uxxxx、 \Uxxxxxxxx)に変換される。
‘surrogateescape’変換できない文字はサロゲートコードポイント (0xDC00 – 0xDFFF)に変換される。
df = pd.read_csv("input/apple_stock.csv", encoding_errors="replace")
df = pd.read_csv("input/apple_stock.csv", encoding_errors="ignore")

on_bad_lines

CSVに不正なレコードが含まれていた場合のハンドリングを指定します。不正なレコードとは、フィールド数が多いレコードなどを指します。

本引数には以下3つの値をしていできます。デフォルトは”error”です。

意味
‘error’Exceptionを送出し、処理を停止する。
‘warn’Warningを送出し、当該行をスキップして処理を継続する。
‘skip’当該行をスキップして処理を継続する。

‘skip’とした場合は、スキップされたことを知る術がないので注意が必要です。基本は’error’または’warn’を使用することを推奨します。

df = pd.read_csv("input/apple_stock.csv", on_bad_lines="warn")

Pythonでデータサイエンスするなら

Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。

ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^

まとめ

pandasでCSVファイルを読み込む方法を紹介しました。CSVファイルをPythonで扱うケースはかなりあると思うので、是非参考にしてみてください。

今回はかなり長くなってしまったが、用途に応じて必要な引数を設定してほしい。

多すぎて使いこなせるか不安です、、

こういう引数あったなくらいで覚えておけばよい。後は、都度調べて使えるようになれば良いだろう。
今回はここまで。次回は、データフレームをCSVファイルとして出力する方法を紹介する。

ありがとうございました~~♪