Pandas プログラミング

Pandasで指定した要素を取り出す方法【Dr. Python#5】

icon
historoid

こんにちには。@historoid1です。

今回はPandasの基本操作を学びましょう

Pandasで指定した要素を取り出す方法

本当に多機能なPandasですが、まずは基本操作を覚えましょう。

「こういうことがしたい」と思うポイントは、データ解析をしていればみんな同じです。そういうところから覚えていきましょう。

今回は、ほしい行や列を取り出す操作を学びます。

前回までのおさらい

前回は、Pandasのデータフレームを作って、欠損値を確認するところまで進みました。

前回の記事
icon
データ解析でまずやるべき2つのこと【Dr. Python#4】

Pandasによるデータ解析をはじめるとき、まずやるべき2つのことがあります。データの概観と欠損値の確認です。

指定した1行だけを取り出す

ではさっそくデータ解析に必須の一連の操作を学んでいきましょう。

行インデックスによる指定

まず下のテーブルを見てください。Pandasのデータフレームです。

一番左側の列には番号が振られていますよね。これを行インデックスといいます。

これを使って、1行だけ取り出します。

df.iloc[0]

これは0行目だけを抜き出します。Pythonでは0からカウントするので、注意してくださいね。

行名による指定

例えば、このようなデータフレームがあったとします。

身長体重
相田17060
井上19090
牛木16055
遠藤18075

先ほどの行インデックスは数字でしたが、今回は名前に変わっています。

これでも同じようにilocで指定できますが、「うーんと……遠藤は何番目だ?」となってしまいますよね(しかも0から数えるのを忘れてズレることもよくあります)。

そこで、行の名前で指定しましょう。

df.loc['相田']

これで相田さんの行を抜き出すことができます。

シングルクォーテーション'で囲むのを忘れてはいけません

文字列はシングルクォーテーションで囲むという鉄の掟があります。

逆にいうと、数字は例外的にシングルクォーテーションで囲まなくて良い、ともいえます。

指定した1列だけを取り出す

指定した行を抜き出す方法とほとんど同じです。

列名による指定

california_housing_train.csvのデータでは、すでに列名が振られているのでまずは列名で指定してみましょう。

df['longitude']

あれ?? 先ほどとは書き方が違っています。

行名での指定方法は、df.loc['xxxx']でしたよね。

そうです。列名指定はちょっと省略して書けるのです。これを行名でやろうとするとエラーが出ますよ。試してみてね。

列インデックスによる指定

とりあえずlongitude列は0列目であることはわかっているので、これを指定しましょう。

(行数や列数が多くなると何番目かなんてすぐには分からないのです。だからilocを使うのはちょっと大変)

df.iloc[:, 0]

はい!! 気が付きましたか?

:,がありますね。これは「すべての行の」という意味です。

ちょっとわかりにくいかもしれませんが、次の項目を読むと「なるほど」と思うはずです。

指定した複数行を取り出す

行インデックスによる指定

今度は複数行を取り出してみます。

df.iloc[0:5]

すると0行目から5行目までの複数行が取り出せます。

さあここでコロン:がまた登場しましたね。

コロンは複数行(または列)を指定する記号だったんですね。

[:, 0]というふうにコロンの左右に何も書かないのは「指定しない」つまり「すべて」という意味になるわけです。

行名による指定

同じように行名でも指定できます。

身長体重
相田17060
井上19090
牛木16055
遠藤18075

この表をまた見てください。

df.loc['相田':'牛木']

これで上から3人分のデータが取り出せるわけですね。

指定した複数列を取り出す

どんどん行きましょう!!

列名による指定

実は以下の書き方だとエラーになります。

df['longitude':'total_rooms']

df['longitude']はありなのに、複数列指定になるとエラーになっちゃうんですね。

むしろdf['longitude']が特殊だったともいえます。

なので基本に忠実に以下のように書きましょう。

df.loc[:, 'longitude':'total_rooms']

「すべての行の」:「longitude列からtotal_rooms列まで」という指定ですね。

列インデックスによる指定

df.iloc[:, 0:4]

そろそろ慣れてきたので、解説はいりませんね?

指定した1つの要素を取り出す

先ほどまでは、1行全部、1列全部を抜き出していましたが、1つの要素だけを抜き出すこともできます。

エクセルでいうと、1つのセルの中身だけを抜き出すということです。

インデックスによる指定

df.iloc[0,0]

0行0列の要素を取り出す、という意味です。

先ほどまでの複数行列を取り出した方法と変わりませんね。カンマで区切っているだけです。

行列名による指定

df.loc['相田','身長']

これも簡単です。

インデックスと行列名の組合せで指定

df.iloc[0]['longitude']

[]が増えました。

まず、df.iloc[0]で0行全体が抽出され、そのあとに['longitude']で指定したという流れです。

指定した複数の要素を取り出す

これまでの方法を組み合わせれば、複数の要素を取り出すこともできます。

インデックスによる指定

df.iloc[0:5, 0:3]

もうわかりますね? 0から5行目のうち、0から3列目を抜き出しています。

行列名による指定

df.loc['相田':'遠藤','身長':'体重']

この例だとそもそも2列しか作ってなかったので、あまり良くない例ですが意味はわかると思います。

インデックスと行列名による指定

df.iloc[5:10]['households']

こんな書き方ですね。


今回はここまでです。

ちょっと説明がくどかったですね。要するに組み合わせによって、自由に値を取り出せるよってことです。

実は他にも値の取り出し方はありますが、まずはlocilocを覚えましょう。

詳しく学びたい方は以下の教科書を参考にしてください。

この本は読み物としても使えますし、辞書としても使えます。Pandasを長らく使うのであれば、手元に置いて損はありません。

では次回は「条件をつけて要素を取り出す方法」について書きたいと思います。

-Pandas, プログラミング

© 2021 historoidのノート