pandasでCSVファイルを読み込む(read_csv)

pandasでcsvを読み込む
スポンサーリンク
スポンサーリンク

Pythonで業務の自動化を行うためにはCSVデータの読み込みや操作が不可欠です。

CSVデータはデータ分析でもよく使われ、Pandasを使ってCSVを扱えると非常に便利です。そこでこの記事では、外部ライブラリのpandasでCSVファイルを読み込む方法を解説します。

スポンサーリンク

使用ライブラリ

ライブラリ :pandas(公式ドキュメント
インストール:必要

外部ライブラリのpandasを利用します。

pandasはデータ解析を支援する機能を提供するライブラリです。表や時系列データを操作するためのデータ構造や演算機能が提供されていて、業務の自動化はもちろん、データ分析や機械学習の前処理にも無くてはならないライブラリです。

ライブラリのインストール

pandasがインストールされていない場合は、pipでインストールします。
・関連記事:Pythonライブラリのインストール(pipの使い方)

python -m pip install pandas

Successfully installed ・・・・と表示されればインストールは成功です。(依存関係のある他のライブラリも同時にインストールされます)

pandasでCSVファイルを読み込む

サンプルデータ

画像のようにヘッダ(列名)を含むデータ:seiseki.csvと、ヘッダを含まないデータ:seieski_noheader.csv、区切り文字が空白のデータ:seiseki_sep.csvを使用します。

サンプルCSVデータ

ちなみに上記のCSVファイルをExcelで開くと文字化けします。

これはExcelが初期設定で文字コードをShift-JISで読み込もうとしますが、ファイルはcp932やUTF-8などで保存されていて、文字コードが合わないために発生します。

ライブラリのインポート

まずpandaspdという名前でインポートします。

CSVファイルの読み込み

CSVを読み込むにはread_csv()メソッドを使用します。

 pandasオブジェクト.read_csv(ファイルパス, encoding=文字コード)

python実行ディレクトリにあるseiseki.csvを読み込んでみます。

pandasのDataFrameとしてシートのデータが読み込まれます。
引数を何も指定しない場合は、インデックスが自動で付与され、1行目がヘッダに設定されます。

インデックスとはデータに対して付与されるラベルで、データの参照や様々な処理で使われます。pandasでデータを扱う際にはインデックスが必要になるため、指定しない場合は自動的に付与されます。

CSV読み込み結果

【補足】
日本語が含まれたCSVを読み込む際に、文字コードの指定をencoding='shift-jis'とすると、以下のようなエラーが表示される場合があります。
UnicodeDecodeError: 'shift-jis' codec can't decode byte 0x87 in position 0: invalid start byte
これはShift-JISには無いWindowsの拡張文字が使用されている事が原因です。そのため日本語が含まれるファイルを読み込む際にはencoding='cp932'としておくのが無難です。
cp932でもエラーが発生する場合は、文字コードにUTF-8 encoding='utf-8' を指定して読み込みます。

インデックスを指定して読み込む

インデックスを指定して読み込みたい場合は、引数にindex_colにインデックス番号もしくは列名を指定して読み込みます。

pandasオブジェクト.read_csv(ファイルパス, index_col=インデックス番号または列名)

列のインデックス番号は下図のように1列目が0から開始します。今回は1列目をインデックスとして読み込んでみます。

インデックス番号


列名を直接指定しても同じ結果になります。

インデックス指定

複数のインデックスを指定して読み込む

インデックスを複数指定して読み込むこともできます。

pandasオブジェクト.read_csv(ファイルパス, index_col=インデックス番号または列名のリスト)

複数のインデックスを指定

特定の行を飛ばして読み込む

特定の行だけを飛ばして読み込みたい場合には、引数skiprowsを指定します。飛ばす行番号はリストで指定します。

pandasオブジェクト.read_csv(ファイルパス, skiprows=行インデックス番号のリスト)


CSVの4,5行目(No3,4)を飛ばして読み込んでみます。

特定の行を飛ばす

ヘッダ(列名)を指定しないで読み込む

読み込むファイルにヘッダ(列名)が無い場合、初期設定ではデータ行がヘッダに設定されてしまいます。その場合は引数にheader=Noneを指定することでヘッダ無しで読み込む事ができます。

pandasオブジェクト.read_csv(ファイルパス, header=None)

サンプルとして以下のデータ(seieski_noheader.csv)を読み込みます。

ヘッダ無し

ヘッダ(列名)を設定・変更して読み込む

ヘッダ(列名)を設定して読み込みたい場合は、引数namesに列名のリストを指定して読み込みます。

pandasオブジェクト.read_csv(ファイルパス, names=列名のリスト)

サンプルファイル seieski_noheader.csv を使用します。

ヘッダ設定



元のデータにヘッダが含まれている場合は、skip_rows=0で1行目を飛ばして2行目から読み込み、列名を設定することで変更します。(seiseki.csv を使用)

ヘッダを変更

欠損値を指定して読み込む

空白の値を読み込むと欠損値を示すNaNとして読み込まれますが、「-」などの文字を欠損値として扱うには、引数 na_values を指定して読み込みます。

pandasオブジェクト.read_csv(ファイルパス, na_values=欠損値として扱う値)

サンプルデータの30, 31行目には、空白と「-」のデータが含まれています。標準では空白のみ欠損値NaNとして扱われるため、na_valuesに「-」を指定して欠損値として読み込みます。

欠損値
欠損値NaN

どちらも欠損値NaNとして読み込まれました。

区切り文字を指定して読み込む

区切り文字が「,」ではなく空白などの場合は、引数sepもしくはdelimiterを指定して読み込みます。

区切り文字サンプル
pandasオブジェクト.read_csv(ファイルパス, sep=区切り文字)
pandasオブジェクト.read_csv(ファイルパス, delimiter=区切り文字)

サンプルファイル seiseki_sep.csv を使用します。

区切り文字

ファイルの一部だけを読み込む

ファイルの一部のデータを読み込みたい時は nrows で行数を指定します。

大きなファイルを扱う時に、どのような引数を使えば正しく処理できるかを把握したい時に使用、処理時間を短縮することができます。

pandasオブジェクト.read_csv(ファイルパス, nrows=読み込む行数)

ファイルを少しずつ読み込む

大きいファイルを一気に読み込むと時間がかかる時など、ブロックに分けて少しずつ読み込むには chunksize で読み込む行数を指定します。

 pandasオブジェクト.read_csv(ファイルパス, chunksize=ブロックの行数)

chunksize を指定すると、返り値は DataFrame ではなく TextFileReader インスタンスとなります。

インスタンスの中身は、以下のように for 文でブロックごとの DataFrame として取り出すことができます。


DataFrame として呼び出したい場合は、get_chunk() メソッドを使用します。引数に呼び出す行数を指定できます。

TextFileReader は読み込まれた位置(ポインタ)を記憶しており、全て読み込むと終了します。

例として、合計が400以上の行を抽出してみます。

pandasでCSVファイルを読み込む方法を解説しました。

・関連記事:PythonでCSVファイルを読み込み・書き込み
・関連記事:pandasでExcelファイルの読み込み(read_excel)
・関連記事:pandasでExcelファイルの書き込み(to_excel)
・関連記事:PythonでExcelファイルを操作する(openpyxl)