【Python】データ分析時に役立つCSV処理

Python(pandas)でCSVファイルを扱う

データ分析を行う際に、CSV形式のデータを扱う事が多いと思います。
PythonCSVを扱う際のちょっとしたテクニックをご紹介します。

CSVに出力されたデータをPython(3系)で読み込む
Python内で生成されたデータフレームをCSVに出力

例えば、このようなCSVファイルがあったとします。

A B C
哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4

このCSVファイルをPythonで読み込んでみましょう。

CSVの読み込み

通常の読み込み

まずは普通に読み込んで見ましょう。

# pandasの読み込み
import pandas as pd

# CSVの読み込み
df = pd.read_csv('sample.csv')

読み込み時点で処理を加えなければ、上記のようなコードになるのではないでしょうか。
今回はシンプルなデータを読み込んでいるので、特別処理を加えてあげる必要はありませんでしたが、
実際に現場で扱うデータは、

  • カラム数が非常に多い
  • カラム数が非常に多い
  • データが大きく、行数が非常に多い
  • 格納されているデータの型が意図したものと異なる

このような課題があるかと思います。
そのままpd.read_csvしてしまうと、 読み込みに時間がかかってしまったり、読み込んだ後にデータ加工を行う必要があります。

そのため、CSV読み込み時に少し工夫をしてあげることで、
後の処理を楽にしてあげましょう。

ヘッダーの有無

通常CSVを読み込む際には、1行目をヘッダーとして認識します。 例えば、下記のようなヘッダーのないCSVがあるとします。

哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4

これを通常通り読み込んでしまうと、先頭行をヘッダーと認識してしまいます。

哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4

本当は1行目をヘッダーとして認識してほしくないのに、 ヘッダーとして認識してしまいました。
この対処法として以下のようにして読み込んでみてください。

df = pd.read_csv('sample.csv', header=None)

読み込んだデータフレームの中身を確認すると。。。

1 2 3
哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4

意図通り、先頭行をヘッダーとして認識せずに読み込む事に成功しました!

encoding

CSV読み込み時に文字コードを指定してあげることができます。
日本語などが含まれるデータを扱う際には、文字コードを指定して読み込んであげる必要があります。

df = pd.read_csv('sample.csv', encoding='utf-8')

utf-8以外にもshift-jisなども設定が出来ます。

型を指定

CSV読み込み時に、データの型を指定することが出来ます。
例えば、C列は数値が入っておりましたが、これを文字列として読み込みたい時は、

A B C
哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4
df = pd.read_csv('sample.csv', dtype = {'C':'object'})

このようにdtypeと追記して、型を指定したい列(C列)と型(object)を記載します。
また、全て文字列で読み込みたいといった場合は、

df = pd.read_csv('sample.csv', dtype='object')

このように記載することで全て文字列として読み込むことが可能です。

nrows

データボリュームが非常に大きい時、最初から全てを読み込まずに100行だけ読み込み、
処理のテストを行いたいこともあります。

例えば、先頭から2行だけ読み込む場合、

df = pd.read_csv('sample.csv', nrows=2)

読み込み時にカラムを指定

CSVを読み込む際に、一部のみを利用する場合、
全て読み込まずカラムを絞って読み込むことも可能です。

例えば、A列とC列のみ読み込みたい場合は、

df = pd.read_csv('sample.csv', usecols=['A', 'C'])
A C
1
ヒル 2
カクレクマノミ 3
ウミガメ 4

A列とC列のみ読み込むことができました!

CSVへの出力

pandasを使った出力の方法

pandasを使ってデータフレームをCSVへ出力する際には、 以下のように実行します。

df.to_csv('sample.csv')

圧縮形式を決めて出力(bz2など)

何も指定しないと圧縮しないままCSVに出力されます。 データが大きい際には、圧縮形式を指定し出力することが可能です。

df.to_csv('sample.csv.bz2', compression='bz2')

mode=a 追記する

仮に同じ名前のCSVをto_csvで生成する際にはデータが上書きされてしまいますが、
上書きせずに追記したいときにも一工夫してあげることで、既存データに追記が可能です。

# 追記する際に、ヘッダーが含まれないようにheader=Noneとする
df.to_csv('sample2.csv', mode='a', header=None)

元のCSV

1 2 3
哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4


追記後のCSV

1 2 3
哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4
哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4

※header=Noneとせずに、追記してしまった場合、
以下のようにヘッダーが複数行含まれたデータになってしまします。

A B C
哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4
A B C
哺乳類 1
ヒル 鳥類 2
カクレクマノミ 魚類 3
ウミガメ 爬虫類 4

列を指定して出力

扱ったデータフレームの、一部のみを出力したい場合、 カラムを指定してCSVに出力することが可能です。

# AとBのみを出力する
df.to_csv('sample.csv', columns=['A', 'B])

出力結果

A B
哺乳類
ヒル 鳥類
カクレクマノミ 魚類
ウミガメ 爬虫類

以上がPythonを使ってCSVを読み込み・出力の際のTipsとなります。

前処理のナレッジ

前処理の知識は、なかなか1人で勉強するには難しいうえに、
ナレッジが共有されている場所はありませんでした。

ところが前処理大全という書籍が発売され、
今まで優秀なデータ分析者の頭の中にあった知識が
1冊の本にまとめされたのです。

今回のCSVを処理するような内容も含められており、
Pythonで実行するサンプルコードも掲載されています。