こんにちは、はやたす(@hayatasuuu )です。
前回の記事では、PandasのコアであるDataFrameの特徴と作成方法を紹介しました。
»前回の記事 : #2 Pandas入門 | Pandasのコア : DataFrameの特徴と作成方法を徹底解説!
その際に、DataFrameは一から作成するより、CSVやExcelから読み込む機会が多いとお伝えしていました。
そこで今回の記事では、Pandasを使ったCSV・Excelの読み込み方法を紹介していきます。
CSVやExcelの読み込みは、必ずと言っていいほど毎回の分析で使いますので、しっかりおさえていきましょう。
事前準備
PandasでExcelを読み込む場合、以下のライブラリが必要になります。
# $マークは不要です!
$ pip install xlrd
まだ入れていない場合には、先にインストールを済ませましょう!
Contents
PandasでCSVやExcelを読み込む方法
この記事では、以下のようなCSV/Excelファイルを読み込んでいきたいと思います。

学内で実施した国数英のテスト結果が格納されているイメージです。学年にはA〜Eまでの5クラスあって、idが各個人の番号ということになります。
この記事で使っていくフォルダ構成は、以下のとおりです。

read_datamart.ipynb
でdataフォルダに入っているCSV/Excelを読み込むコードを書いていきます。
score_sheet_non_header.csv/xlsxは、1行だけデータがズレているCSV/Excelファイルです。

上画像のように、1行だけ下にズレた状態になっています。CSVやExcelファイルだと、このようになっているケースもあるので、今回追加で準備しました。
パターン① : 純粋にCSVやExcelを読み込む
まずはシンプルにCSVやExcelを読み込む方法です。
例えばCSVファイルを読み込むなら、pd.read_csv()
でカッコの中身にファイルパスdata/score_sheet.csv
を書きます。
csv_df = pd.read_csv('data/score_sheet.csv')
excel_df = pd.read_excel('data/score_sheet.xlsx')
これだけでCSVファイルを読み込めます。Excelを読み込むときは、pd.read_excel()
に変更するだけです。
このようにpd.read_**()
を使うと、Pandas DataFrameの形に読み込んでくれます。
※pd.read_csv()
などで読み込んだ結果は、df
という名前をつけることが多いです!
それでは、読み込んだ結果を確認しましょう。
あとのレクチャーで詳しく紹介しますが、df.head()
で読み込んだデータの先頭5行を確認できます。

※HorizontalDisplay()
は、こちらの記事で紹介されているクラスです。クラス名のとおりで、DataFrameを横並び・水平に表示できます!
両方とも問題なく読み込めて、結果も一致していますね。
パターン② : ヘッダーを指定してCSVやExcelを読み込む
データによっては、下画像のようにヘッダーがズレていることがあります。

このような場合に、先ほどと同じくpd.read_**()
を使ってしまうと、同じくズレた状態でデータの読み込みをおこなってしまいます。

先頭の行は明らかに要らなくて、1つ下からデータの読み込みをしたい。
このようなときは、以下のように、pd.read_**()
の引数でheader=1
と書いてあげます。
csv_df2 = pd.read_csv('data/score_sheet_non_header.csv', header=1)
excel_df2 = pd.read_excel('data/score_sheet_non_header.xlsx', header=1)
読み込んだ結果が、以下のとおりです。

引数header
は、デフォルトで0になっています。Pythonのリストと同じように行番号の管理をしているので「0番目=1行目」です。
header=1にしてあげることで「1番目=2行目」から読み込んでいるというわけですね。
パターン③ : 型を指定してExcelやCSVを読み込む
ここまで2パターンのファイル読み込み方法を紹介しました。
- パターン① : 純粋にCSVやExcelを読み込む
- パターン② : ヘッダーを指定してCSVやExcelを読み込む
でも、これらの読み込み方法には少し問題点がありました。それは何かと言うと、idの読み込みでゼロ落ちしている点です。
元のCSV/Excelファイルを見てみると、idのカラムには00001のように、先頭がゼロ埋めされています。

これがpd.read_**()
を使ってファイル読み込みすることで、ゼロ落ちしていたわけです。
なぜこのような結果になるのかというと、それはPandas側で自動的にidカラムをint型に変換してくれていたからです。
言い方を悪くすると、余計なことをしてくれたわけですね(笑)
基本的に、IDなどのユニークで振られたものは、ゼロ埋めされた状態で読み込むのが鉄則です。
そのためには、pd.read_**()
の引数dtype
で、型を指定する必要があります。具体的には、Pythonの辞書型で{'id': object}
を指定します。
csv_df3 = pd.read_csv('data/score_sheet.csv', dtype={'id': object})
excel_df3 = pd.read_excel('data/score_sheet.xlsx', dtype={'id': object})
ここで書いたobjectは、いったん「数値型以外」だと認識しておけば大丈夫です。
それでは、ファイルの読み込みをおこなっていきましょう。

そうすると上画像のように、ゼロ埋めがキープされた形でデータを読み込めました。
後の講義で紹介しますが、df.dtypes
で各カラムの型を確認できます。出力結果が以下になっていて、idカラムがobject型になっていますね。

また、ファイル全体を文字型で読み込みたいときは、Pythonの辞書型で指定しても良いですが、dtype=object
と書けばOKです。
csv_df3 = pd.read_csv('data/score_sheet.csv', dtype=object)
excel_df3 = pd.read_excel('data/score_sheet.xlsx', dtype=object)
df.dtypes
で確認してみると、すべてのカラムがobject型になっていますね。

以上が、よく使うCSV/Excelファイルの読み込み方法でした。
補足 : その他の引数について
この記事ではpd.read_**()
の引数でheader
やdtype
を紹介しました。
今回紹介した2つほど使用頻度は高くないですが、次いで使う機会の多い引数が3つほどあります。
- usecols : 読み込むカラムをインデックス番号で設定できます
- nrows : 読み込む行数を設定できます
- encoding : 文字コードを設定できます
特に引数encoding
は、他より使用頻度が高いです。
pd.read_csv()
やpd.read_excel()
でファイルを読み込むとき、デフォルトの文字コードはUTF-8になっています。
なので、読み込みたいファイルがUTF-8でなければ、対応する文字コードを引数encoding
に渡してあげます。
例えば文字コードがShift-JISであれば、encoding='shift-jis'
と設定するだけです!
まとめ : PandasでCSVやExcelを読み込む方法
というわけで、今回はPandasでCSVやExcelを読み込む方法を紹介してきました。
この記事で書いた内容をおさえておけば、データの読み込みで苦戦することはなくなるはずです。
次回は、DataFrameの中身を確認する6つの文法を紹介していきます。
基礎だけどよく使うものを紹介するので、しっかり習得していきましょう!