Pandas⑥DataFrameのデータ抽出方法

目次

当記事について

Python学習を独学でいろいろ手を出してきた結果、YouTube学習に落ち着きました。

記事という体裁をとっていますが、動画視聴後の復習での振り返り用として主に自分に向けて記事を書いています。

YouTube学習をはじめた経緯

YouTubeでは数多のプログラマーの方々が非常に有益な情報を発信してくれています。

そんな多くのチャンネルの中からキノコードさんに辿り着いたのは偶然でした。

動画の解説が自分にとっては分かりやすく、初学者に向けて作成してくれている点も視聴開始のきっかけとなりました。

そのため、YouTube学習はキノコードさんのチャンネルに絞って学習しています。

Youtube:キノコード/プログラミング学習チャンネル

SeriesやDataFrameのデータ抽出について

今回は、SeriesやDataFrameの特定の列や行、または特定の条件に一致するデータを抽出する方法について学ぶ。

Pythonでできない抽出はない、と言われているくらいなんでも抽出できる。

使用するデータについては、前回同様政府が発表している1920年〜2015年までの全国の人口推移のデータを使用する。

データの読み込みと設定

import pandas as pd
pd.set_option ( ‘ display.max_columns ‘ , None )
pd.set_option ( ‘ display.max_rows ‘ , 5 )
表示する列(columns)と行数(rows)の設定
set_optionとNone
  • set_option ( ) :( )でオプションの設定
  • None:表示させる列数は制限しないよ、という意味

df = pd.read_csv ( ‘ data.csv ‘ , encoding = ‘ shift-jis ‘ )
df
data.csvを読み込む
読み込むことができた

インデックスの行番号を振り直す

基本的にインデックスの行番号は0からはじまる。

+1する設定を行うことで、インデックス番号を1からはじまる番号に振り直すことができる

df . index = df . index + 1
df
index+1をインデックス番号にしますよーというコード
インデックス番号が1からに変更された

上図のとおり、インデックス番号が

「0 → 938」から「1 → 939」へと変更された

DataFrame をスライスでデータ抽出を行う

スライスを使って最初の3行を抽出する。

df [ 0 : 3 ]
df [ 1 : 3 ]と書くと、2 , 3となるので注意が必要

df [ 1 : 3 ] と書いてしまうと、抽出されるのは「2、3」となってしまうことに注意する。

開始位置が0からの場合は一部省略が可能

df [ : 3 ]
0から始まる場合は何も書かなくてもOK

開始位置の0を省略して記述した場合も同じデータを抽出することができた。

使いやすい書き方で良い。

例1)10〜14行目を抽出する

df [ 9 : 14 ]
これで10〜14の意
10行目〜14行目が抽出できている

例2)101行目〜105行目を抽出する

df [ 100 : 105 ]
101行目〜105行目が抽出できた

Seriesをスライスでデータ抽出する

DataFrameは1行取り出すとSeriesになる。

人口(総数)の1列をスライスを使用して抽出する。

df [ ‘ 人口(総数) ‘ ] [ : 5 ]

Seriesとしてデータを抽出することができた。

SeriesではなくDataFrameのまま抽出する方法

列名を1つ指定してDataFrameからスライスでデータを抽出すると、データ型はDataFrameからSeriesに変化してしまう。

抽出したデータを、DataFrameのまま抽出したい場合には、二重角カッコを使う。

df [ [ ‘ 人口(総数) ‘ ] ] [ : 5 ]
SeriesではなくDataFrameとしてデータ抽出ができた

複数の列を指定してデータを抽出する

複数の列を指定してデータを抽出するには、二重角カッコ内で、抽出したい列をカンマで区切って記述すれば良い

df [ [ ‘ 都道府県名 ‘ , ‘ 人口(総数) ‘ ] ] [ : 5 ]
指定した列をDataFrameのまま抽出することができた

条件に一致する行のみデータを抽出する

真偽値について

たとえば、西暦(年)が2015年に一致する行を抽出する場合には次のような記述をする。

df [ ‘ 西暦(年) ‘ ] == 2015
TrueやFalseが返ってきた

上記のコードを書くとTrueやFalseが返ってきた。

真偽値とは

TrueやFalseを返す値のこと

今回の例では2015年に一致する行がTrue、一致しない行がFalseとして返ってきていることがわかる

以上のことをふまえて、西暦(年)が2015年のDataFrameだけを抽出する場合には、次のようにコードを記述する。

df [ df [ ‘ 西暦(年) ‘ ] == 2015 ]

真偽値でTrueとなった部分(2015年)のみを抽出することができた

条件に一致する行のみデータ抽出する:文字列の場合

都道府県名が東京都になっているDataFrameだけを抽出する場合には、次のように記述する

df [ df [ ‘ 都道府県名 ‘ ] == ‘ 東京都 ‘ ]
都道府県が東京都の部分だけを抽出できた

条件に一致する行のみデータ抽出する:10の倍数

西暦(年)が10の倍数のものだけ抽出したい場合には、まず10の倍数をどのように定義すればよいかを考える必要がある。

西暦(年)を10で割り余りが0であれば、それは10の倍数だということができる。

df [ ‘ 西暦(年) ‘ ] % 10 == 0

上図のように、西暦(年)を10で割って余りが0のデータはTrueが表示され、余りが0にならないデータについてはFalseが返ってきた。

これをコードに付け加えてあげれば10の倍数のみデータ抽出ができる

df [ df [ ‘ 西暦(年) ‘ ] % 10 == 0 ]

上図のとおり、真偽値でTrueが返ってきたデータのみを抽出することができた

条件に一致しない行のみをデータ抽出する

Not演算子を使う

df [ ~ ( df [ ‘ 西暦(年) ‘ ] % 10 == 0 ) ]
〜(Not演算子)

〜(条件式):条件式に一致しないという意味になる

不等価演算子を使う

Not演算子の記述は不等価演算子を使っても同様にデータを抽出することができる

df [ df [ ‘ 西暦(年) ‘ ] % 10 != 0 ]

上図のとおり、Not演算子を使用したときと同じデータを抽出することができた

  • !=:不等価演算子(A!=B:AとBは等しくない)
  • ==:等価演算子(A==B:AとBは等しい)

2つの条件が「かつ」、「または」条件の場合

(条件1)(条件2)という形

西暦が2015年で、「かつ」東京都であるデータを抽出する

df [ ( df [ ‘ 西暦(年) ‘ ] == 2015 ) & ( df [ ‘ 都道府県名 ‘ ] == ‘ 東京都 ‘ ) ]
2つの条件に合致するデータを抽出することができた

(条件1)(条件2)という形

西暦2010年、または2015年のデータを抽出する

df [ ( df [ ‘ 西暦(年) ‘ ] == 2010 ) | ( df [ ‘ 西暦(年) ‘ ] == 2015 ) ]

特定条件でデータを抽出するqueryメソッド

queryメソッドとは

条件に合うデータの行を抽出する関数で、スッキリとした条件式を書くことができる

query(’ 条件式A ‘ )と記述する:条件式Aに合致するデータを抽出する

カラム名に丸カッコ( )があるとqueryメソッドは使えない

カラム名に丸カッコがあるとqueryメソッドを使うことができないので、丸カッコではない名前に変更する必要がある。

西暦(年)を「year」に変更する

renameメソッド

rename ( columns = { ‘ 変更前の名前 ‘ : ‘ 変更後の名前 ‘ } )

df = df.rename ( columns = { ‘ 西暦(年) ‘ : ‘ year ‘ } )
df
カラム名の西暦(年)がyearに変更された

比較演算子を使ってqueryメソッドを記述する

等価演算子:2010年のデータだけを抽出する
df.query ( ‘ year == 2010 ‘ )
2010年だけのデータを抽出することができた
比較演算子:2010年を超えるデータのみを抽出する
df.query ( ‘ year > 2010 ‘ )
2010年を超えるデータのみを抽出できた

(or条件)を使ったqueryメソッド

2010年または2015年のデータのみを抽出する

df.query ( ‘ year == 2010 or year == 2015 ‘ )
2010年または2015年のデータを抽出するqueryメソッド

上図のとおり、2010年または2015年のデータのみを抽出することができた

(and条件)を使ったqueryメソッド

東京都で、かつ2015年のデータを抽出する

df.query ( ‘ 都道府県名 ‘ == ” 東京都 ” and year == 2015 ‘ )

こちらについても条件に合致するデータのみを抽出することができた

特定の値に一致するデータを抽出するisinメソッド

isinメソッドで真偽値を確認する

isinメソッドを使うと特定の値一致するデータのみを抽出することができる

df [ ‘ year ‘ ] . isin ( [ 2010 ] )
真偽値のTrueとFalseが返ってくる

これをデータフレームを取り出すコードに付け加える

df [ df [ ‘ year ‘ ] . isin ( [ 2010 ] )

特定の値に一致するデータを抽出するisinメソッド:複数条件時の場合

df [ df [ ‘ year ‘ ] . isin ( [ 2010 , 2015 ] )

2010年と2015年の条件に合致するデータのみを抽出することができた

isinメソッド

isin [ 条件 ] :条件に合うデータのみを抽出する。

isin [ 条件A 、条件B ] : 条件が複数ある場合にはカンマで区切る

特定の値を含むデータを抽出する

部分一致

抽出する文字列に、一部だけが一致しているものを「部分一致」という。

「部分一致」する行を抽出するには

PandasのSeriesのstrメソッドと、抽出したい文字列の条件に応じ

  • containsメソッド:部分一致
  • startswithメソッド:最初が一致
  • endswithメソッド:終わりが一致

これらを組み合わせて使うと、条件に一致するものを抽出することができる。

containsメソッド:特定の文字列が含まれる要素を抽出する

df [ df [ ‘ 都道府県名 ‘ ] . str . contains ( ‘ 山 ‘ ) ]
山が含まれる都道府県名を抽出する
都道府県名に「山」が含まれるデータを抽出することができた

startswithメソッド:特定の値からはじまる要素を抽出する

df [ df [ ‘ 都道府県名 ‘ ] . str . startswith ( ‘ 大 ‘ ) ]
大からはじまるデータを抽出することができた

endswithメソッド:特定の値で終わる要素を抽出する

df [ df [ ‘ 都道府県名 ‘ ] . str . endswith ( ‘ 道 ‘ ) ]
「道」で終わるデータを抽出することができた

列の最大値・最小値に当てはまる条件のデータを抽出する

maxメソッド:最大値を取得する

df [ df [ ‘ year ‘ ] == df [ ‘ year ‘ ] . max ( ) ]
yearの最大値は2015なので、2015年のデータが抽出された

minメソッド:最小値を取得する

df [ df [ ‘ year ‘ ] == df [ ‘ year ‘ ] . min ( ) ]
yearの最小値は1920なので、1920年のデータが抽出された

行や列を指定してデータを抽出する方法

locメソッド:895列目の列名「人口(男)」と「人口(女)」のデータを抽出する

df . loc [ 895, [ ‘ 人口(男) ‘ , ‘ 人口(女) ‘ ] ]
条件に合致する895列目の人口(男)と人口(女)の部分だけを抽出できた

まとめ

以前DataFrameとSeriesについて勉強した際には内容がもっさりとしていてあまり理解できていなかった。

今回はDataFrameを使いながら実際でも使う機会がありそうなパターンについていくつか学ぶことができた。

動画についてもわりとすんなりと頭に入ってきたので、今回の動画視聴分については繰り返し自分で色々なパターンでデータ抽出を試してみると理解が深まりそうな手応えがあった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA