たなブログ 教養を高めて生涯資産を増やすブログ(`・ω・´)

【Python Coding】pandasでデータフレームから値を取得

PR Pythonを学ぶ

こんにちは、TAKです。
今回は、pythonのpandasを使ってデータフレームから行列の値を取得する方法を紹介していきたいと思います。

データフレームから値を取得しようとしても、意外とその操作方法って忘れがちじゃないですか?一度見れば簡単に扱えるものが多いですが、毎回ネットで検索して色々なデータ取得方法を確認するのは非効率です。

そこで今回は、データ分析時に比較的使うことが多いデータ取得方法を中心に紹介していきます。

【こんな人に読んで欲しい記事です】

● pandasを使ってデータフレームから値を取得出来るようになりたい方

● 毎回データフレームの値取得方法を忘れてしまうため、効率的な方法を知りたい方

必要ライブラリのインポート

今回使うライブラリのインポート

まず今回使うライブラリをインポートしておきましょう。
データフレームの操作なのでpandasメインで使っていきますが、アヤメデータセットをデータとして用いるのでsklearnライブラリもインポートしておいてください。

利用データの作成

アヤメデータを使えるようにセッティングしていきます。
今回はデータセットから行列を取得することが目的なので、作り方の詳細説明は省きます。

今回使うアヤメデータをDataFrame化した結果

少し補足しておくと、説明変数のカラム名(デフォルト)には「(cm)」があってデータ取得時に扱いづらいので変更しています。また、目的変数のカラム名は「name」としています。

このデータセットを用いて行列の値を取得出来るようにしていきます。
以下では「列」の取得と「行」の取得を別々に紹介していますが、必要に応じて組み合わせるなどして使えるようにしてみてください。どれがベストというわけではなく、目的と使いやすさを重視した上で選択して使ってみてください。

【列の取得①】1つのカラムを抽出

まずは1つのカラムを取得出来るようにしましょう。
特定の特徴量を持ったカラムだけ抽出するケースは頻繁にあるので、使えるようにしてください。

カラムの抽出は`df[column名]`で出来ます。
「sepal width」と「petal length」をそれぞれ取得した結果が以下のコードです。

「sepal width」を取得した場合|先頭5行のみ表示
「petal length」を取得した場合 |先頭5行のみ表示

いずれもカラム名を指定しただけでデータを取得出来ていることがわかりますね。

【列の取得②】複数のカラムを抽出

次に、複数のカラムを指定してデータを抽出する方法を見ていきましょう。
使い方自体は先ほどと同じなので難しくありません。

抽出したいカラム名を変数で取得した後に、データフレームに指定する方法がオススメです。
「sepal length」と「name」の2カラムを取得したい場合は以下のように指定すればOKです。

複数カラムを抽出した場合|sepal lengthとnameを指定

「name」以外のカラムを取得したい場合は以下のようになります。

複数カラムを抽出した場合|name以外を指定

いずれの場合も、指定したカラムを抽出することが出来ましたね。

ここで1つポイントとなるのが、カラム1つだけを抽出した場合は「Series型」、カラム2つ以上を抽出した場合は「DataFrame型」となっている点です。今はピンとこなくても、これを知っていると結構便利です。

● データフレームからカラムを単独で取得した場合 : Series型

● データフレームからカラムを複数で取得した場合 : DataFrame型

【行の取得①】True条件を用いる方法

続いて、データフレームから特定条件に合致する「行」データを取得する方法を2つ見ていきます。

まず1つ目に紹介するのは、「条件合致=True」を用いる方法です。
言葉だけだとわかりにくいので、実際コードをみてイメージを深めてみましょう。

カラム名「name」が「0」である行だけを抽出したい場合を考えます。

特定条件に一致した場合は「True」|不一致の場合は「False」

上記のようなコードを書くことで、条件式に一致するものは「True」と表示させることが出来ます。
データフレームに「True」指定すれば、Trueに該当するデータだけを取得出来るので、この性質を利用してあげましょう。

以下では条件式部分をflagとして変数に格納し、`df[変数名(True)]`とすることで欲しいデータを取得しています。

カラム「name」が「0」だけのデータを取得した結果|末尾5行だけを表示

上記では末尾5行だけを表示させていますが、「name」がすべて「0」になっていますね。

ここで、もう一つ使えるテクニックを紹介しておきます。
それは、`df[~変数名(True)]`と「チルダ(~)」を追加する方法です。これにより、True以外のデータ(つまりFalse部分)を表示させることが可能になります。

チルダ(~)を用いてデータを取得する方法

これにより、カラム「name」が「0」以外(1と2)のデータを取得出来ているのがわかりますね。

【行の取得②】クエリを用いる方法|基本

データフレームから条件に合致する行を取得する2つ目の方法は「クエリ」を使う方法です。
SQL経験がある方なら馴染みのある言葉かもしれませんが、知らなくても大丈夫です。

使い方を一般化すると、df.query(column == `value`)といったイメージです。
まず、カラム「name」が「1」だけのデータを取得したいケースを想定したコードを見てみます。

クエリを使って「name=1」を取得した結果

上記は数値なので直接指定してOKですが、文字列を指定する場合は”(クオテーション)や””(ダブルクオテーション)が必要になる点だけ注意です。

【行の取得③】クエリを用いる方法|カラム名に空白がある場合

次に、「sepal length」のようなカラム名にスペース(空白)が含まれている例を考えてみます。
具体的には、「sepal length」が「5.0」以上であるデータを取得することを目的とします。

その前に、これから紹介する方法ではpandasのversionが「0.25」以上である必要がありますので、今のversionを確認しておきましょう。

pandasのversionを確認

pandasのversionが古い方は、以下の方法でアップデートしておいてください(以下Windows環境)。

pandasをpipでアップデート

「sepal length」が「5.0」以上のデータを取得するイメージコードは以下のようになりますが、以下ではアップデート前なのでいずれの場合もエラーになります。

エラーとなる場合のコード例

pandasをアップデートした後のコードが以下となります。

カラム名にスペースがあるデータをクエリで取得した場合

上記コードのように、カラム名にスペースがある場合には「バッククオート(“)」する必要があります。

【行の取得④】クエリを用いる方法|変数利用+複数条件の指定

最後に、複数条件を満たすデータを取得する例を想定してみたいと思います。
具体的には、「sepal length」が「7.0」以上かつ「sepal width」が「3.5」以上であるデータを取得することを目的とします。

とその前に、クエリの中で「変数」を使えるようにする方法を紹介しておきます。
結論から言うと、以下コードのように変数前に@をつけるだけでOKです。

クエリ内で変数を使えるようにする方法

この方法を用いて、複数条件を指定出来るようにしたコードが以下の通りです。
クエリの中で変数を用いつつ、AND条件で繋げれば欲しいデータの取得が可能になります。

クエリを用いて複数条件に合致するデータを取得する方法

さいごに

今回は、pythonのpandasを用いてデータフレームから行列を取得する方法を紹介してきました。

ここで紹介した方法以外にも、「df.loc」や「df.iloc」を用いた方法がありますが、個人的には使用頻度が高い方法を今回紹介させてもらいました。

最終的には自分が使いやすい方法を見つけて使いこなすことが重要だと思うので、今回の記事がそのきっかけになれば幸いです。

今回はこのへんで。