こんにちは!
前回の投稿で、Pythonでデータ分析を行うにあたって必須のライブラリとして”Pandas”を紹介しました。
ただ、前回紹介した内容だけでは全く物足りないので、pandasでできることについてもっと深堀りしていこうと思います。
今回の記事では、
- データフレームから指定した行列のデータを取得する
- 取得する条件を指定してデータを取得する
ことができるようになることを目標にしています!
データ分析を行ううえで、データを検索(取り出す)する場面はよくあります。
検索の仕方をマスターして、効率よくデータ分析を始めていきましょう!!
今回のデータ
import pandas as pd
from sklearn.datasets import load_boston
data = load_boston()
df = pd.DataFrame(data.data, columns=data.feature_names)
今回も、ボストンの住宅価格データを使っていこうと思います。
データの検索
まずは、データの検索をしていきましょう。大体の場合、必要なデータってすべてじゃなくてどこか一部分ですよね。
なので、データフレームからどこか一部分を抜き出すという操作は頻繁に行います。
指定した列を取り出したい
まずは指定した列だけを取り出してみましょう。例えば、CRIM列を取り出す場合、
df[["CRIM"]]
というように、列名で指定します。すると、
といったように、”CRIM”列の値を返してくれます。同様に、
df[["CRIM", "ZN"]]
といったように、複数指定することで、複数列を取り出してきてくれます。
あれ?なんで指定するときに[ ]が2つ重なっているんだ?と感じた方、鋭いです。
[ ]を1重にした場合、データフレームとしては結果を返してくれません。df = ["CRIM"]
さっきと出力結果が違いますね。これは、Seriesと呼ばれるデータ構造です。
データフレームの1列だけバージョンがSeriesという理解でいいと思います。
pandas公式さん曰く、Seriesはnumpyのndarrayと非常によく似た構造で、互換性を持っているとのことでした。
つまり、Seriesのままいろいろ計算にぶち込めちゃうよということです。numpyを使って演算処理をするようになると、便利さが理解できるようになると思います^^
特定の行を取り出したい
次は、特定の行を取り出したい場合を見ていきましょう。
行を指定するときには、インデックスを用います。インデックスとは、各行を一意に識別する数字や文字列のことです。
dfの場合、左端の0~505までの数字がインデックスにあたります。
では、インデックスを使って行を取り出しましょう。行を指定するときは、コロン(:)を使います。
df[1:4]
というふうに指定することで、1行目から4行目までを指定することができます。
ここで、インデックスは0から始まる点に注意してください。また、
df[〇〇:△△]
と指定したときは、「〇〇以上、△△未満」という結果が返ってきます。指定した最後の行は含まれないので、注意してください。
特定の行、列を指定して取り出したい (loc)
列だけとか行だけじゃなくて、両方指定して取り出したいときもありますよね。というか多くの場合がそうだと思います。
そんな時に使うのがlocです。
たとえば、CRIM列の1~3行目を取り出したいというときは、
df.loc[1:3, "CRIM"]
というように書けば、Seriesで返ってきます。2列以上指定すると、データフレームとして返ってきます。
locの[ ] の中は、
[行を指定 , 列を指定]
という順序です。
locで行の範囲を指定する場合は、〇〇以上、△△以下の値が返ってきます。特定行を指定する場合と少し異なるので、要注意です^^;
複数の列を抽出する場合は、
df.loc[:, ["CRIM","ZN"]]
のように記述します。
行の指定のところがコロン(:)だけになっていますね。
これは、全てを指定するという意味です。何か指定しなきゃいけないけど、全部取り出したいというときはこのように書けば取り出せます。
データの位置で指定して取り出したい (iloc)
先ほどは、列名などを指定してデータを取り出しました。
今から紹介するilocは、何列目、何行目のデータなのかを数字で指定することで、データを取り出すことができます。
df.iloc[:5, 2:4]
例のように指定すると、5行目までのデータの3、4列目のデータを取得することができます。
ここでも、数え上げは0からスタートするので、注意してください。
数字の指定はややこしいので、実行して求めるデータが得られているか確認することをお勧めします。
取り出す条件を指定したい
データフレーム上の位置ではなくて、指定の条件を満たすものだけを取り出したいということもあります。
たとえば、年齢が50歳以下のデータだけ取り出したい とか。
pandasでは、そういったデータの取り出し方もできます。
試しに、年齢が50以下の行をすべて取り出してみましょう。
df.loc[df["AGE"] <= 50, :]
条件を付けてしていするときは、locを用います。
行指定の部分に注目してください。このように条件式を入れることで、条件を満たすデータだけ取り出すことができます。
結果は以下の通り
AGE列が50以下のものばかりになっています。
複数条件を指定
複数の条件を指定することもできます。
例えば、『AGEが50以下かつNOXが0.5以上』のデータを指定したい場合、
df.loc[(df["AGE"] <= 50) & (df["NOX"] >= 0.5), :]
のように記述します。各条件式を ()でくくり、論理演算子でつなぎます。
実行結果は、
となります。相当絞れました。
『AGEが50以下またはNOXが0.5以上』という条件の場合、
df.loc[(df["AGE"] <= 50) | (df["NOX"] >= 0.5), :]
という結果になります。論理演算子 (&, |) の書き方には注意してくださいね。
Pythonでデータサイエンスするなら
Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。
ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^
初学者の方にはこちらもオススメです^^
まとめ
いかがだったでしょうか。
今回紹介したpandasでのデータ検索は、データ分析を行うえで頻出のスキルです!
どのように検索すればいいのかということを把握して、効率よくデータ分析を進めていきましょう!
ではでは👋