Pandasのread_csvは、ただ単にデータが読み込めるだけではない
Pythonのライブラリの一つ、Pandasはデータサイエンスに欠かせないものです。
Pandasの中でも、read_csvはデータサイエンスの勉強をしている方やデータサイエンティストの方にとって、特に馴染みのある関数かと思います。
read_csvを初めて聞いた人向けに説明すると、この関数はcsv形式のファイルをPandasのDataFrameに読み込むという役割を持っています。*1
基本的な使い方は、以下の通りです。
import pandas as pd df = pd.read_csv("fileName.csv")
もし、csvファイルに日本語が含まれている場合はエンコーディングを引数で指定します。
import pandas as pd # cp932 が日本語用のコード df = pd.read_csv("ファイル名.csv", encoding="cp932")
ロシア語やアラビア語など、他の言語でもエンコーディングを指定する必要があります。
その場合は、以下のサイトからコードを探して引数で指定すると読み込めます。
以上が基本的な使い方ですが、read_csv()のドキュメントを見てみると、たくさんの引数が用意されています。
そこで、今まで業務で使用してきたものと、新しく知って便利だと思ったものをまとめたいと思います。
- 使用するデータ
- 使用する列を絞りたいとき
- 読み込むファイルの列のデータ型を指定したいとき
- 読み込むときに飛ばしたい行があるとき
- 先頭の何行かだけ試しに見てみたいとき
- 日付データを読み込みたいとき
- まとめ
- ちなみに...
使用するデータ
適当に自作した、NameList.csvというファイルを使います。
中身は全て英語のため、エンコーディングの指定はしていません。
以下のコードで読込み、出力した結果は画像の通りです。
import pandas as pd df = pd.read_csv("NameList.csv")
使用する列を絞りたいとき
csvファイルのデータサイズが非常に大きいが、分析で使いたい列は全部ではない、ということが実務ではあるかと思います。
ファイルを読み込んだ後に、Pandasのdrop関数で削除するという手もありますが、データを読み込む時間がもったいないと感じることもあるのではないでしょうか。
そこで、usecolsという引数を使えばデータを読み込む時点で使用する列を絞ることができ、読み込む時間も短縮することができます。
以下がコードと出力結果です。
import pandas as pd # 使用したい列を"FirstName", "LastName", "BirthDate"とする df1 = pd.read_csv("NameList.csv", usecols=["FirstName", "LastName", "BirthDate"])
読み込むファイルの列のデータ型を指定したいとき
read_csvは、元のファイルのデータから自動的にデータ型を認識して読み込んでくれます。
しかし、例えば数値で書かれている”型番”や"コード"の列をstring型で読み込みたいとします。
読み込んだ後にastypeで変換できますが、読み込むときにdtypeという引数を使用すれば、列ごとにデータ型を指定して読み込むことができるので、わざわざ変換するコードを書く必要がありません。
この例では、"Age"の列をint型ではなくstring型で読み込みたいとします。
以下がコードと出力結果です。
import pandas as pd # "Age"をstring型で読み込みたいとき df2 = pd.read_csv("NameList.csv", dtype= {"Age": str})
読み込むときに飛ばしたい行があるとき
read_csvは、ファイルにある全ての行と列を読み込みます。
基本的には、全てのデータを読み込むことで不便になることはないですが、仮に1行目にデータの説明が書いてあるとします。
データを読み込むときには、その1行目が邪魔かと思います。
そこで、skiprowsという引数を使うと指定した行を飛ばして読み込むことができます。
今回は、1行目を飛ばしたいとして、コードと出力結果を載せます。
import pandas as pd # 1行目(indexが0の行)を飛ばしたいとき df3 = pd.read_csv("NameList.csv", skiprows=[0])
先頭の何行かだけ試しに見てみたいとき
csvファイルのデータサイズが大きくて読み込みに凄く時間がかかりそうだけど、データの中身を確認したいというときがあるかと思います。
csvファイルを直接開いて確認するという手ももちろんありますが、データサイズが大きいと開くのにも時間がかかります。
そんな時に便利なのが、nrowsという引数です。
nrowsで行数を指定すると、先頭から指定した行数だけ読み込むことができます。
以下がコードと出力結果です。
import pandas as pd # 最初の3行だけ読み込みたいとき df4 = pd.read_csv("NameList.csv", nrows=3)
日付データを読み込みたいとき
最後は、最近知った便利な引数です。
日付のデータが入っているcsvファイルを読み込むと、string型(ただの文字列)で読み込まれます。
日付データを使用して計算したい場合、pd.to_datetimeでTimestamp型(datetime64[ns]型)に変換する必要があります。
pd.to_datetimeを使うとき、引数で日付データのフォーマットを指定しないと上手く読み込めないかと思います。
しかし、ファイルを読み込むときにどの列が日付データなのかをparse_datesという引数で書いておくと、わざわざフォーマットを指定しなくてもTimestamp型で読み込んでくれます。
以下がコードと出力結果です。
import pandas as pd # "BirthDate"は日付データ df5 = pd.read_csv("NameList.csv", parse_dates=["BirthDate"])
parse_datesで変換されたデータは、pd.to_datetimeで変換したものと同じなので、日付データを問題なく計算できます。
まとめ
以上がread_csvの便利な引数です。
pandasやnumpyなどの使い方はKaggleで学べますが、データがきれいな状態で用意されています。
しかし、実務の場合は必ずしもすぐに使えるような状態のデータが使えるわけではありません。
読み込むときにあらかじめ引数で設定しておけば楽な上に、データ型の違いでmergeができない、などの大したことがないエラーを防ぐことができるのでおすすめです。