PythonTech Blogデータ分析 

PandasでCSVファイルを読み書き

はじめまして!DATUMSTUDIOのゴトウです!
台風13号が首都圏に接近中ですね。通勤通学時等くれぐれもお気をつけください。

前置き

データ分析を行う際に、CSV形式のデータを扱う事が多いと思います。
以下の場合における、ちょっとしたテクニックをご紹介します。
  1. CSV形式のファイルをPython(3系)で読み込む
  2. Python内で生成されたデータフレームをCSV形式ファイルとして出力する
本記事では、以下のデータを持つCSVファイルを例として進めます。
ABC
哺乳類1
アヒル鳥類2
カクレクマノミ魚類3
ウミガメ爬虫類4
 
通常の読み込みと出力
とくに処理を加えなければ、以下のコードになります。
# pandasの読み込み
import pandas as pd

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

# CSVとして出力
df.to_csv('output.csv')  
今回はシンプルなデータを読み込んでいるので、特段、処理を加える必要はありませんが、
実際のデータは、
  • カラム数が非常に多い
  • データが大きく、行数が非常に多い
  • 格納されているデータの型が意図したものと異なる
という課題があるかと思います。
なにも考えず読み込みをすると、余計に時間がかかってしまったり、読み込んだ後に追加の加工が必要になったりします。

このとき、以下に挙げるような工夫を加えることで、
後の処理を楽になることがあります。

 ①読み込み時の工夫

ヘッダーの有無

通常CSVを読み込む際には、1行目をヘッダーとして認識します。
例えば、下記のようなヘッダーのないCSVがあるとします。
哺乳類1
アヒル鳥類2
カクレクマノミ魚類3
ウミガメ爬虫類4
これを通常通り読み込んでしまうと、先頭行をヘッダーと認識してしまいます。
哺乳類1
アヒル鳥類2
カクレクマノミ魚類3
ウミガメ爬虫類4
 
本当は1行目をヘッダーとして認識してほしくないのに、
ヘッダーとして認識してしまいました。
この対処法として以下のようにして読み込んでみてください。
df = pd.read_csv('sample.csv', header=None)
読み込んだデータフレームの中身を確認すると。。。
123
哺乳類1
アヒル鳥類2
カクレクマノミ魚類3
ウミガメ爬虫類4
先頭行をヘッダーとして認識せずに読み込む事に成功しました!

encoding

CSV読み込み時に文字コードを指定してあげることができます。
日本語などが含まれるデータを扱う際には、文字コードを指定して読み込んであげる必要があります。
df = pd.read_csv('sample.csv', encoding='utf-8')
utf-8以外にもshift-jisなども設定が出来ます。

型を指定

CSV読み込み時に、データの型を指定することが出来ます。
例えば、C列は数値が入っておりましたが、これを文字列として読み込みたい時は、
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'])
AC
1
アヒル2
カクレクマノミ3
ウミガメ4
A列とC列のみ読み込むことができました!

②出力時の工夫

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

何も指定しないと圧縮しないままCSVに出力されます。
データが大きい際には、圧縮形式を指定し出力することが可能です。
df.to_csv('output.csv.bz2', compression='bz2')

mode=a 追記する

仮に同じ名前のCSVをto_csvで生成する際にはデータが上書きされてしまいますが、
上書きせずに追記したいときにも一工夫してあげることで、既存データに追記が可能です。
# 追記する際に、ヘッダーが含まれないようにheader=Noneとする
df.to_csv('output.csv', mode='a', header=None)
元のCSV
ABC
哺乳類1
アヒル鳥類2
カクレクマノミ魚類3
ウミガメ爬虫類4
 
追記後のCSV
 
ABC
哺乳類1
アヒル鳥類2
カクレクマノミ魚類3
ウミガメ爬虫類

4

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

4

 
 
※header=Noneとせずに、追記してしまった場合、
以下のようにヘッダーが複数行含まれたデータになってしまします。
 
 
ABC
哺乳類1
アヒル鳥類2
カクレクマノミ魚類3
ウミガメ爬虫類

4

AB

C

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

4

 

列を指定して出力

扱ったデータフレームの、一部のみを出力したい場合、
カラムを指定してCSVに出力することが可能です。
# AとBのみを出力する
df.to_csv('output.csv', columns=['A', 'B'])
AC
1
アヒル2
カクレクマノミ3
ウミガメ4

まとめ

以上がPythonを使ってCSVを読み込み・出力の際のTipsとなります。
今回ご紹介した方法以外にもまだまだ出来ることはたくさんありますので
是非公式ページなどから情報を収集してみてください。

リンク

DATUM STUDIOでは様々なAI/機械学習のプロジェクトを行っております。
詳細につきましてはこちら

詳細/サービスについてのお問い合わせはこちら

このページをシェアする:



DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。