データサイエンス&サイバーセキュリティ備忘録

Python, Data Science, Kaggle, Cyber Security, CTF, などなど

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")

ロシア語やアラビア語など、他の言語でもエンコーディングを指定する必要があります。

その場合は、以下のサイトからコードを探して引数で指定すると読み込めます。

docs.python.org

以上が基本的な使い方ですが、read_csv()のドキュメントを見てみると、たくさんの引数が用意されています。

そこで、今まで業務で使用してきたものと、新しく知って便利だと思ったものをまとめたいと思います。

使用するデータ

適当に自作した、NameList.csvというファイルを使います。

中身は全て英語のため、エンコーディングの指定はしていません。

以下のコードで読込み、出力した結果は画像の通りです。

import pandas as pd

df = pd.read_csv("NameList.csv")

f:id:a7xche:20200503005410p:plain

使用する列を絞りたいとき

csvファイルのデータサイズが非常に大きいが、分析で使いたい列は全部ではない、ということが実務ではあるかと思います。

ファイルを読み込んだ後に、Pandasのdrop関数で削除するという手もありますが、データを読み込む時間がもったいないと感じることもあるのではないでしょうか。

そこで、usecolsという引数を使えばデータを読み込む時点で使用する列を絞ることができ、読み込む時間も短縮することができます。

以下がコードと出力結果です。

import pandas as pd

# 使用したい列を"FirstName", "LastName", "BirthDate"とする
df1 = pd.read_csv("NameList.csv", usecols=["FirstName", "LastName", "BirthDate"])

f:id:a7xche:20200503013035p:plain

読み込むファイルの列のデータ型を指定したいとき

read_csvは、元のファイルのデータから自動的にデータ型を認識して読み込んでくれます。

しかし、例えば数値で書かれている”型番”や"コード"の列をstring型で読み込みたいとします。

読み込んだ後にastypeで変換できますが、読み込むときにdtypeという引数を使用すれば、列ごとにデータ型を指定して読み込むことができるので、わざわざ変換するコードを書く必要がありません。

この例では、"Age"の列をint型ではなくstring型で読み込みたいとします。

以下がコードと出力結果です。

import pandas as pd

# "Age"をstring型で読み込みたいとき
df2 = pd.read_csv("NameList.csv", dtype= {"Age": str})

f:id:a7xche:20200503020805p:plain

読み込むときに飛ばしたい行があるとき

read_csvは、ファイルにある全ての行と列を読み込みます。

基本的には、全てのデータを読み込むことで不便になることはないですが、仮に1行目にデータの説明が書いてあるとします。

データを読み込むときには、その1行目が邪魔かと思います。

そこで、skiprowsという引数を使うと指定した行を飛ばして読み込むことができます。

今回は、1行目を飛ばしたいとして、コードと出力結果を載せます。

import pandas as pd

# 1行目(indexが0の行)を飛ばしたいとき
df3 = pd.read_csv("NameList.csv", skiprows=[0])

f:id:a7xche:20200503220328p:plain

先頭の何行かだけ試しに見てみたいとき

csvファイルのデータサイズが大きくて読み込みに凄く時間がかかりそうだけど、データの中身を確認したいというときがあるかと思います。

csvファイルを直接開いて確認するという手ももちろんありますが、データサイズが大きいと開くのにも時間がかかります。

そんな時に便利なのが、nrowsという引数です。

nrowsで行数を指定すると、先頭から指定した行数だけ読み込むことができます。

以下がコードと出力結果です。

import pandas as pd

# 最初の3行だけ読み込みたいとき
df4 = pd.read_csv("NameList.csv", nrows=3)

f:id:a7xche:20200503225451p:plain

日付データを読み込みたいとき

最後は、最近知った便利な引数です。

日付のデータが入っている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"])

f:id:a7xche:20200503231115p:plain

parse_datesで変換されたデータは、pd.to_datetimeで変換したものと同じなので、日付データを問題なく計算できます。

まとめ

以上がread_csvの便利な引数です。

pandasやnumpyなどの使い方はKaggleで学べますが、データがきれいな状態で用意されています。

しかし、実務の場合は必ずしもすぐに使えるような状態のデータが使えるわけではありません。

読み込むときにあらかじめ引数で設定しておけば楽な上に、データ型の違いでmergeができない、などの大したことがないエラーを防ぐことができるのでおすすめです。

ちなみに...

最後に1つ。

read_csvはその名の通り、csv形式のファイルを読み込むものです。

しかし、csvファイルが圧縮された状態のzipファイルでもread_csvで読み込めます。

import pandas as pd

# NameList.csvを圧縮したもの
df = pd.read_csv("NameList.zip")

f:id:a7xche:20200503234420p:plain

入社したばかりのときに知ったのですが、わざわざファイルを展開しなくても読み込めるので地味に便利です笑