pythonをデータ解析目的で使用していると、特定の値を示す行を抽出したり、閾値を決めて閾値を超えた範囲の行を切り取ったりといった処理をしたい時がありますね。
pythonの行列処理というと、numpyを使うことが多いのですが、個人的には、行の抽出を行うときに限っては、pandasというパッケージを使ったほうが都合が良いことが多い印象です。
そこで今回はpandasを使った行の抽出処理について例を挙げながら紹介していきましょう。
※あくまでも初心者駆け出しの甘味が試行錯誤した結果なども含まれます。もっとスマート書き方や間違いなどあるかもしれませんがご了承ください。
pandasはデータ解析に便利なパッケージ
pandasもやはり最初はimportから始まる。最初の行に書いておきましょう
実際に書くimport構文のコードとしてはこんな感じですね。
import pandas as pd
他にnumpy と一緒にpandasを使いたい場合には、この構文の下にnumpyのimport構文を追加するだけになります。
基本的にはスクリプトで使うと思われるパッケージやモジュールに関しては、一番最初の行から書いてしまっておかなければなりません。
データの配列をpandasに変更するには、pd.Dataframeを使う
pd.Dataframeはインデックスを付けれるので便利
このインデックスをうまく使うことがによって特定の値以上の配列を抽出したり、特定の項目が特定の値を示したときの行を抽出したりすることができます。
言い換えるなら、スクリプトで計算した値を抽出して、最終的に結果を記載する上で使う処理をする上で、pd.Dataframeは便利であるといえます。
pd.Dataframenのインデックスを用いたデータ抽出方法の例
まずは、csvファイルをimportしてそれぞれの変数定義を行います。
import pandas as pd import numpy as np data = nogenfromtxt('data.csv', delimiter = ',') time = data[:,0] a = data[:,1] b = data[:,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)
さらに、今度は再度データを統合して、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....の値をそれぞれ抽出するといった処理も行うことができます。