Translate

【初心者向け】とりあえず手っ取り速くpandasでcsvファイルを読み取る方法【pandas】

 こんにちは

pythonに慣れてくると、いろいろなパッケージを利用していく機会が増えてくると思います。その中でもよく使うのがnumpyとpandas、あとはmatplotlib当たりになりますが、これらのパッケージは数値計算とか科学計算などでうまく使えると非常に心強いパッケージたちであるといえます。

その中でも、データの抽出だったり並べ替え、補間だったりの作業で重宝するのがpandasです。pandasは、numpyともよく似ているパッケージではありますが、行列の描写に関してはnumpyよりも優れている点があるため、科学計算などで最初にデータを読み取るときには、非常に役に立ちます。

今回はpandasでcsvデータをうまく読み取る方法を紹介して、皆さん自身でお持ちの科学計算の生データが入ったcsvファイルをpythonでうまく使えるようになることを目的とします。


pandas でcsvを読み込む



#必要なパッケージのインポート
import pandas as pd

import glob

filename = glob.glob('*.csv')
data =  pd.read_csv(e_filename[0],sep=",",encoding='utf-8',header=0)


ざっくりとコードを書くとこんな感じになります。いちいちcsvのファイル名を入れるのが面倒臭いので、グローバル関数というものを使って、同じフォルダ内に存在するcsvdファイル名を取得するコードのリストを作成し、そのリストの中の何番目のcsvのファイル名にするという感じで作成しています。

今回の場合は、同じファイルの中に複数のcsvファイルがあると仮定して、その中の一番目のファイル名のcsvファイルをpandasで読み取るようにしてあります。

pandasでcsvファイルを読み取る場合には必ず、sep = ','と記述して下さい。これはテキストファイルがなんの区切りになっているかをpandasに伝えるためのコードです。csvファイルは一般的にはカンマ区切りで設定されているため、sep = ','となるわけであります。

ちなみに、普段扱っているデータがcsvファイルではなく、メモ帳などで開ける形式のtxtファイルの場合には、sep = ' 'とします。コーテーションの中は半角スペースを空けます。これはtxtファイルがスペース区切りという形式でデータが区切られていることからそうなります。

では、csvファイルでも、txtファイルでもないデータの場合にはどうなるのでしょうか?一度Excelでデータを読み取った後にExcel上でcsvなりtxtなりに保存すればこれまで通りの方法でpython上でpandasを使ってデータを読み取ることができます。

実はそういった特殊な拡張子の形式の場合には、カンマ区切りでも、スペース区切りでもない第三の区切り方のことが多いです。たいていの場合は、sep = '\t'にするとうまくいく場合が多いです。これはタブ区切りを表していて、trcファイルとかそういった特殊なファイル形式だけどExcelでcsvで読めるようなファイル形式の場合に有効です。

pandasでのcsvの読み取りでヘッダーをうまく使う

pandasでcsvファイルを読みこむ際に、ヘッダーを設定しておくと後々便利になります。ヘッダーはいわゆる行列の目次のようなもので、これを指定しておくと後で、列ごとにデータを抽出したりするときに役に立ちます。

先ほどのコードの中でheader = 0という項目があったと思いますが、ここではcsvファイルの一行目の各列のデータをヘッダーとして読み取る、という意味合いになります。

例えばヘッダーを使ったコードになるとこんな感じです。例としては一行目一列目にdata1、一行目二列目にdata2という名前のヘッダーが入っていたとします。これをあらかじめheaderとして読み取ると後でこういった記述ができるようになります。


#必要なパッケージのインポート
import pandas as pd

import glob

filename = glob.glob('*.csv')
data =  pd.read_csv(e_filename[0],sep=",",encoding='utf-8',header=0)

data1 = data['data1']
data2 = data['data2']


こんな感じの記述をしてデータを抽出することが可能になります。数列程度のデータであればこんな書き方をせずに、列番号で指定してやれば済む話ではありますが、例えば列数が数10列あるような膨大なデータの場合には、何列目とか探すのも大変ですし、列がずれてしまえばエラーの原因にもなります。

このヘッダーの名前で抽出する方法はそういったヒューマンエラーをなくす上でも非常に有用だと思います。

csvファイルをpandaで読み取ったうえでnumpy配列に戻す場合にはこうすればできます。


#必要なパッケージのインポート


data1 = np.array(data['data1'])
data2 = np.array(data['data2'])


pandasとnumpyは行き来がわりと融通が利くので、どちらの行列描写でやったらよいかを考えて使い分けられるようになると、より一層pythonで科学データをうまく使えるようになると思います。