Translate

【初心者向け】pythonの行の抽出などの処理はpandasがとても便利【python】


pythonをデータ解析目的で使用していると、特定の値を示す行を抽出したり、閾値を決めて閾値を超えた範囲の行を切り取ったりといった処理をしたい時がありますね。

pythonの行列処理というと、numpyを使うことが多いのですが、個人的には、行の抽出を行うときに限っては、pandasというパッケージを使ったほうが都合が良いことが多い印象です。

そこで今回はpandasを使った行の抽出処理について例を挙げながら紹介していきましょう。

※あくまでも初心者駆け出しの甘味が試行錯誤した結果なども含まれます。もっとスマート書き方や間違いなどあるかもしれませんがご了承ください。

pandasはデータ解析に便利なパッケージ



そもそもpandasとはいったいどのようなツールなのでしょうか?pandasはnumpyと並んでデータ解析で有用なツールです。

pandasはnumpyと比べて列にインデックスをつけることが出来たりするのでインデックスを使って行の範囲の抽出を行うことができる点において有利です(多分numpyでもできるかもしれませんが、pandasの方が感覚的使えて初心者には便利だと思います...あくまでも個人的な感想ではありますが(笑))

pandasもやはり最初はimportから始まる。最初の行に書いておきましょう

pandasもnumpyと同じようにパッケージの一つになるので、プログラムのスクリプトの最初の処理としては、import構文から始まります。このコードを書いておかなければ、スクリプト内でpandasを使用することが出来ません。

実際のコードとしてはこんな感じです。構文はほとんどnumpyと変わりません。共通する点としては、最初のimport構文の時点で略称名を宣言する点が挙げられます。

numpyはnpと略すことが多いのですが、一方でpandasの場合には、pdと略して使用するのが一般的ですね。

実際に書くimport構文のコードとしてはこんな感じですね。

import pandas as pd

他にnumpy と一緒にpandasを使いたい場合には、この構文の下にnumpyのimport構文を追加するだけになります。

基本的にはスクリプトで使うと思われるパッケージやモジュールに関しては、一番最初の行から書いてしまっておかなければなりません。

データの配列をpandasに変更するには、pd.Dataframeを使う

スクリプト内で読み込ませたcsvファイルをpandasで扱うためには、pandas用のデータ収納に切り替える必要があります。

そのための処理として使うモジュールが、pd.Dataframe、とpd.Seriesが挙げられます。どちらもnp.arrayみたいな使い方にはなるのですが、個人的には前者のpd.Dataframeの方が、データ解析のスクリプトを作る上では便利だと思います。

pd.Dataframeはインデックスを付けれるので便利

pd.Dataframeでpandasのデータ型を作る大きな利点としては、pd.Dataframeの場合には、配列にインデックスをつけることができることが挙げられます。

このインデックスをうまく使うことがによって特定の値以上の配列を抽出したり、特定の項目が特定の値を示したときの行を抽出したりすることができます。

言い換えるなら、スクリプトで計算した値を抽出して、最終的に結果を記載する上で使う処理をする上で、pd.Dataframeは便利であるといえます。

pd.Dataframenのインデックスを用いたデータ抽出方法の例

それでは、実際にpd.Dataframeのインデックスを使ってデータの抽出を行う例を紹介したいと思います。

今回は、一列目を時間、二列目を変数1、三列目を変数2とした二元配列を含んだ”data.csv”という仮定のデータを使ったデータ抽出を行います。

データの抽出の課題としては、変数1の値が最大となった時の時間の値を求めるといった感じで行きましょう。

まずは、csvファイルをimportしてそれぞれの変数定義を行います。

import pandas as pd
import numpy as np

data = nogenfromtxt('data.csv', delimiter = ',')
time = data[:,0]
a = data[:,1]
b = data[:,2]

まずはデータ定義の部分までコードを書きました。time は時間、a は変数1、b は変数2と上記のコードでは定義されました。

次には、今回の処理に必要になる変数1の最大値を計算します。


import pandas as pd
import numpy as np

data = nogenfromtxt('data.csv', delimiter = ',')
time = data[:,0]
a = data[:,1]
b = data[:,2]

amax = max(a)

これで変数1の最大値の値を得ることができるようになりました。


さらに、今度は再度データを統合して、pandasのデータ型に変更しましょう。この時点で変数2はいらないので、時間と変数1の値だけの配列作ります。

ここでさらに、変数1の値をインデックスとして定義します。

import pandas as pd
import numpy as np

data = nogenfromtxt('data.csv', delimiter = ',')
time = data[:,0]
a = data[:,1]
b = data[:,2]

amax = max(a)
list1 = pd.Dataframe(time, index = a)

これでpandasのデータ型での処理がlist1を使うことによって処理することが可能なります。

次は今回の課題である、変数1の値が最大値となるときにtimeの値を抽出するようなコードを書きましょう。

実際のコードはこんな感じです。



import pandas as pd
import numpy as np

data = nogenfromtxt('data.csv', delimiter = ',')
time = data[:,0]
a = data[:,1]
b = data[:,2]

amax = max(a)
list1 = pd.Dataframe(time, index = a)
list2 = list1.ix[amax]

この最後のコードの”.ix”は、ざっくりと説明するとインデックスの特定の値の行を抽出するという処理になります。今回のコードはすなわち「インデックス内のamaxの値を示すところの変数aの値を抽出する」という処理の流れになります。

そのため、特定の閾値を算出して使う配列をインデックスに入れておくことで、閾値を使った行の抽出を行うことができるようになります。

今回は変数も少ないので簡単ですが、これは変数が増えても、列を結合させて任意の二次元配列を作ることで対応できます。

たとえば、特定の時間の時の変数1、変数2....の値をそれぞれ抽出するといった処理も行うことができます。

抽出できたデータの保存はループに組み込んだりすることで可能

こういった閾値を用いて計算して抽出したデータの保存に関しても、ループ回路の組み込んでしまうのが簡単です。glob.globを使うと、先ほどのコードみたいにいちいち、csvファイル名を入力しなくてもよいので気軽に使うことができます。

pythonとnumpyを使用したループ回路の作成方法については過去に紹介しているので、そちらのコードを参照してくださると幸いです。紹介されているループ回路の計算処理部分を変えることにより、大きく変更しなくても使用することが出来るでしょう。