Pandas入門講座|07.データ抽出の方法【PythonのライブラリPandas】

はじめに

こんにちは。キノコードです。

この動画では、SeriesやDataFrameの特定の列や行、あるいは特定の条件に一致するデータを抽出する方法について説明します。初心者の方でもわかりやすいように丁寧な解説を心がけました。

Pandas入門講座|07.データ抽出の方法【PythonのライブラリPandas】

この動画では、DataFrameの特定の列や行、あるいは、特定の条件に一致するデータを抽出する方法を学んでいきます。
データの前処理や分析をする時、特定の行や条件に一致したものだけを抽出したい場面が多くあると思います。
この動画では、色々なデータ抽出の方法をみていきますなので、この動画の内容を習得すれば、さまざまなデータ抽出の場面で役に立つでしょう。
また、Pythonはプログラミング言語などでカスタマイズが可能、できないデータ抽出はないといっても過言ではないでしょう。
さらに、前のレッスンで学んだエクセルのデータを取り込んだり、Databaseと接続をしてデータ抽出を自動化しても良いでしょう。
頑張って最後までご視聴ください。
読み込む前の準備として概要欄に記載したキノコードのサイトにCSVファイルを用意しています。
それをダウンロードして、学習用のJupyter Labを保存しているフォルダにに保存してください。
それではパソコン画面に切り替えてレッスンを進めていきましょう。

Pandasインポート

import pandas as pd

それでは、Pandasをインポートするところから始めていきましょう。
まず、Pandasをインポートする記述をかきます。
「import pandas as pd」をかきます。
「as」は、ライブラリ名(pandas)を好きな名前で使うことができます。
したがって、この記述により「pandas」を「pd」という名前で使うことができます。
エラーにならず、インポートが完了しました。

表示する列数・行数を変更

pd.set_option(‘display.max_columns’, None) # 最大表示列数
pd.set_option(‘display.max_rows’, 5) # 最大表示行数

次に、表示する列数・行数を変更します。
データフレームでは、列のことをcolumn、行のことをrowといいます。
今回は表示させる列数は制限なし、行数を5と設定します。
「pd.set_option」をかきます。
次に、丸括弧をかいて、シングルクォーテーションをかきます。
シングルクォーテーションの中に、「display」をかいて、ドット、「max_columns」とかきます。
最後に、表示させる列数をかきます。今回は制限なしなのでNoneとします。
行数の記述も同様に、先ほどの列数の記述の「max_columns」の箇所を「max_rows」に置き換えて記述すればOKです。行数は5としましょう。

データフレームの読み込み

df = pd.read_csv(‘data.csv’,encoding=’shift-jis’)
df

続いてレッスンで使うデータを説明します。
このレッスンでも、今までのレッスンで使った、政府が発表している「1920年から2015年までの全国の人口推移のデータ」を使います。
csvファイルには、和暦や西暦ごと、各都道府県ごとに人口推移のデータが記述されています。
read_csv関数を使って、csvファイルを読み込みます。
read_csv関数の使い方を忘れた方は、レッスン06を復習してください。
それでは、実行してみましょう。
csvファイルを読み取ることができました。

インデックス番号の振り直し

df.index = df.index + 1
df

次に、レッスンをわかりやすくするためにインデックス番号を振ります
indexを使って列に番号を振り直しましょう。
indexは0始まり、0,1,2,3と増えていきます。したがって、すべてのインデックスに1を足せば、1,2,3,4というインデックスになります。
df.indexとかいて、プラスをかいて1をかきます。これですべてのインデックスに1が足せます。
これを再度、df.indexに代入をします。
結果を見てみましょう。
列の一番左にインデックス番号が1から順に振られました。

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

df[0:3]

スライスでデータ抽出する方法についてみていきましょう。
スライスとは、データの一部分を切り取ってデータ取得する仕組みのことをいいます。
Pythonのスライスでは、角括弧で該当範囲の開始位置と終了位置をコロンで挟むように記述をします。
最初の3行を抽出してみましょう。
dfとかいて、角括弧をかきます。
次に、行は0行目から始まるため、0をかいてコロンをかき、3をかきます。
実行すると、最初の3行を抽出できました。

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

df[:3]

なお、スライスでは開始位置が0の場合、省略することも可能です。
先ほどと同様に最初の3行を抽出する場合、角括弧の中の0を省略して記述してもOKです。
実行すると、先ほどと同じ結果が得られました。

df[9:14]

例えば、10〜14行目を抽出したい場合は次のように記述しましょう。
dfとかいて、角括弧をかき、9とかいてコロンをかき、14をかきます。
先ほどと同様に、行は0行目から始まるので、10ではなく9とかく点に注意しましょう。
実行すると、10〜14行目のデータを抽出することができました。

df[100:105]

101〜105行目を抽出したい場合も同様です。
dfとかいて、角括弧をかき、100とかいてコロンを書き、105をかきましょう。
実行すると、101〜105行目のデータが抽出されました。

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

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

スライスは、DataFrameだけではなく、Seriesでもできます。
DataFrameは、1列取り出すとSeriesになるとレッスン04でお伝えしました。
「人口(総数)」の1列を取り出してスライスを使ってみましょう。
dfとかいて角括弧をかきます。
シングルクォーテーションをかいて、列名「人口(総数)」をかきます。
最初の5行を指定して抽出してみましょう。
角括弧を追記して、コロンをかいて5をかきます。
実行します。
最初の5行のみが抽出されました。

列名を指定したDataFrameをスライスでデータ抽出

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

先ほどは、列名を指定して最初から5番目までを抽出することができましたが、
ここまでの記述だと、データ型がDataFrameではなく、Seriesになってしまいます。
データ型がSeriesだと扱えない場合があるため、DataFrameとして抽出する方法を試してみましょう。
DataFrameとして抽出する方法は、レッスン04で説明しました。
2重角括弧を使うことで、DataFrameとして抽出することが可能でしたね。
先ほどの人口(総数)の列を二重角括弧にして、最初の5行を指定して抽出する記述にしてみましょう。
実行してみましょう。
DataFrame構造で抽出出来ました。

df[[‘人口(総数)’,’都道府県名’]][:5]

複数の列を指定して、データを抽出してみましょう。
抽出したい列をカンマで区切って、列名を指定すればよいです。
都道府県名と人口(総数)の列を、最初の5行だけDataFrameで抽出してみましょう。
先ほどの「人口(総数)」のあとにカンマ、次に都道府県名を記述します。
実行してみましょう。
都道府県名と人口(総数)のデータが抽出されました。

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

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

次は真偽値を使ったデータ抽出をみていきましょう。
真偽値とは、TrueとFalseのことです。
この真偽値を使ってデータ抽出ができます。
西暦(年)が2015年に一致する行を抽出してみます。
先ほどと同様、dfとかいて角括弧をかき、シングルクォーテーションをかきます。
西暦(年)をかいて、イコールを2つかき、2015をかきましょう。
こうすると、条件に一致する行がTrue、しない行がFalseが返ってきます。
実行してみます。
TrueとFalseが返ってきました。

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

これをDataFrameの中の角括弧の中に入れればオッケーです。
実行してみます。
西暦が2015に一致する行のみが抽出されました。

条件に一致する行のみデータ抽出(文字列)

df[df[‘都道府県名’] == ‘東京都’]

次が文字列での条件でデータを抽出していきましょう。
東京都を指定して、データを抽出してみます。
先ほどの2015のデータ抽出の時は、数値だったので2015をそのまま記述しました。
今回は、文字列なので、シングルクォーテーションをかきます。
実行します。
都道府県名が東京都の行が抽出できました。

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

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

続いて、西暦が10の倍数のデータを抽出してみましょう。
10の倍数つまり、西暦を10で割った時の余りが0となる場合ということになります。
Python超入門コースの演算子のところで説明しましたが、余り、つまり剰余を求めるのは%でしたね。
次に西暦(年)をかいて、%をかいて10をかきます。
イコールを2つかき、0をかきましょう。
実行します。西暦が10の倍数の行が抽出されました。

条件に一致しない行のみデータ抽出(Not演算子)

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

続いて、西暦が10の倍数ではない条件の記述をしてみましょう。
先ほど見た、10の倍数の剰余が0であるかないかという真偽値を返す記述の前に、NOT演算子である、「~」をかきます。
実行します。
西暦が10の倍数ではない行が抽出されました。

条件に一致しない行のみデータ抽出(不等価演算子)

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

こちらの記述では、「~」を使用しましたが、イコール2つを「!=」に置き換えても、同様の結果が得られます。
イコール2つを等価演算子といいます。エクスクラメーションとイコールで、不等価演算子になります。
実行してみます。同様の結果を得られました。

and条件

df[(df[‘西暦(年)’] == 2015) & (df[‘都道府県名’] == ‘東京都’)]

2つの条件のかつの条件、つまりandの条件でデータ抽出してみましょう。
西暦2015年、かつ、東京都の行を抽出してみましょう。
andの条件でデータ抽出する場合、
1つの目の条件の記述と、2つ目の条件の記述を、&マークで結んであげればよいです。
実行します。2015年の東京都のデータのみが抽出できました。

or条件

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

次は、OR条件でデータ抽出してみましょう。
OR条件でのデータ抽出は、「|(パイプライン、縦棒)」でできます。
西暦2010年または、2015年の行を抽出してみます。
まず、dfとかいて角括弧をかきます。
次に、丸括弧をかき、西暦が2010年と一致するという1つ目の条件を記述しましょう。
そして、「|」をかき、西暦が2015年と一致するという2つ目の条件を記述します。
実行すると、2010年と2015年のデータのみが抽出されました。
さて、ここで少し休憩です。ここまでのレッスンはいかがでしたか?
キノコードでは、株のデータ分析のレッスンや、Excelの業務自動化のレッスンも配信しています。
まだチェックしていない方は、一度さらりとみてみてください。
またチャンネル登録がお済みじゃない方は、新着動画も通知されますのでチャンネル登録をお願いします。
それではレッスンの続きをやっていきましょう。

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

df = df.rename(columns={‘西暦(年)’: ‘year’})
df

今までみてきたデータ抽出は、queryメソッドを使ってもできます。
SQLがわかる方は、queryメソッドはSQLのwhereと同じだと考えれば覚えやすいと思います。
ただし、カラム名に丸括弧があるとqueryメソッドをうまく使えないので、「西暦(年)」というカラム名を「year」に変更しておきましょう。
カラム名の変更はrenameメソッドでできましたね。
レッスン04で説明しているので忘れた方は復習してみてください。

df.query(‘year == 2010’)

では、queryメソッドを使ってみます。
2010年のデータのみ抽出してみましょう。
dfドットqueryと書いて丸括弧。
丸括弧の中は、シングルクオテーションで囲みます。
year イコール2つで等価演算子。2010と記述します。
実行します。
2010が抽出できました。

df.query(‘year > 2010’)

比較演算子も使うことができます。
2010年を超えるデータのみ抽出してみましょう。
year 大なり2010です。
実行します。
2010を超えるデータのみ抽出できました。

df.query(‘都道府県名 == 東京都’)

文字列の条件を抽出する場合は、どのようにすればいいでしょうか?
都道府県名で東京都のみを抽出してみましょう。
東京都は文字列なので、ダブルクオテーションでくくってあげます。
カラム名については、英語であっても日本語であっても、ダブルクオテーションなどはいらず、そのまま記述してあげればオッケーです。
yearの時もダブルクオテーションなどくくってあげていませんでしたよね。
それと同じです。

特定の条件でデータ抽出するqueryメソッド(or条件)

df.query(‘year == 2010 or year == 2015’)

次は、2つの条件、or条件をみていきましょう。
2010年のデータと2015年のデータをみていきましょう。
year等価演算子2010と書きます。それをor条件で結んであげれば良いです。
続いてyear等価演算子2015です。
実行します。
2010年と2015年のデータを抽出できました。

特定の条件でデータ抽出するqueryメソッド(and条件)

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

次はand条件をみていきましょう。
東京都で、かつ、2015年のデータを抽出します。
先ほどorを記述したところにandを記述してあげて、それぞれの条件をかいてあげればOKです。
東京都の中で2015年のデータのみ抽出ができました。

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

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

等価演算子を使ってデータ抽出をしていた部分を、isinメソッドを使ってデータ抽出をすることもできます。
yearのカラムの中で2010年のデータのみを抽出してみましょう。
カラム名を指定したあとにisinを記述して丸括弧。
その中に角括弧を記述します。
2010をかきましょう。
そうすると、TrueかFalseの値が返ってきます。
実行します。TrueかFalseの値が返ってきました。

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

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

これをDataFrameの角括弧の中に記述してあげればよいです。
実行します。
2015年のデータのみ抽出できました。

特定の値に一致するデータ抽出するisinメソッド(複数条件)

df[df[‘西暦(年)’].isin([2010,2015])]

複数の条件で抽出したい場合は、角括弧の中でカンマで区切ってあげれば良いです。
実行します。
2010と2015のデータを抽出できました。

特定の値を含むデータを抽出するcontainsメソッド

df[‘都道府県名”].str.contains(‘山’)

例えば、都道府県名のカラムの中で、「山」という文字が含まれている場合や、「大」という文字で始まる場合、「道」でおわる場合で抽出する場合はどのようにすればよいでしょうか?
抽出される文字列に、一部が一致している場合を部分一致といいます。
部分一致する行を抽出するには、PandasのSeriesのstrメソッドと、抽出したい文字列の条件に応じて、containsメソッド、endswithメソッド、startswithメソッドを組み合わせて使えばよいです。
次は、都道府県名の列に、「山」という文字が含まれるデータを抽出してみます。
特定の文字や文字列を含んでいるデータを抽出するには、containsメソッドを使います。
使い方をみていきましょう。
まず、dfとかいて角括弧をかきます。シングルクォーテーションをかきます。
都道府県とかいて、ドットをかき、str.containsをかきます。
これを実行すると、「山」という文字が含まれる行がTrueで返ってきて、含まない行はFalseが返ってきます。
実行します。
True、Falseが返ってきています。

特定の値を含むデータを抽出するcontainsメソッド

df[df[‘都道府県名’].str.contains(‘山’)]

これをdfの角括弧の中に記述をすれば、山という文字列が含まれる元号である、平成のデータが抽出されるはずです
実行します。
山形、富山、山口が抽出できました。

特定の値から始まるデータを抽出するstartswithメソッド

df[df[‘都道府県名’].str.startswith(‘東’)]

特定の文字や文字列から始まる場合はstartswithメソッドを使います。
「大」から始まる都道府県を抽出してみましょう。
containsだった部分をstartswithに変更すれば良いです。
実行してみましょう。
大分や大阪が抽出できました。

特定の値で終わるデータを抽出するendswithメソッド

df[df[‘都道府県名’].str.endswith(‘道’)]

特定の文字や文字列で終わる場合はendswithメソッドを使います。
「道」で終わる都道府県を抽出してみましょう。
実行します。
北海道が抽出できました。

maxメソッドを使ったデータ抽出

df[df[‘西暦(年)’] == df[‘西暦(年)’].max()]

続いて、列の最大値に当てはまる条件のデータを抽出してみます。
最大値を指定するには、maxメソッドを使用します。
記述してみましょう。
dfと書いて角括弧を書きます。
次に、西暦が西暦の最大値に一致する、という条件を記述します。
実行します。
実行すると、西暦の最大値、つまり2015年に合致するデータが抽出できました。
もちろん、minなどのメソッドを使って抽出することもできます。

locメソッドを使ったデータ抽出

df.loc[895,[‘人口(男)’,’人口(女)’]]

locを使った行や列を取得する方法は、レッスン04のデータフレームのところで説明しました。
895行目の、列名「人口(男)」と「人口(女)」を抽出してみましょう。
dfドットlocをかきます。
locは、角括弧で行と列の順番で指定しましたよね。
最初に、行名の895を記述しましょう。
カンマをかいて、複数の列名を指定するのでリストをかいて、列名「人口(男)」をかいてカンマをかき、「人口(女)」をかきます。
実行します。
想定通りの結果で抽出ができました。

確認問題

それでは確認問題をやっていきましょう。
1 今まで表示できる行数を5行としてきましたが、制限なしの設定に変更してください。
2 スライスを使ってデータフレームの151目から156行目まで抽出してください。
3 真偽値を使って、2015年の中で人口総数が500万人以上のデータを抽出してください。
4 「人口(総数)」のカラムをpopulationという名前に変更して、queryメソッドを使って人口1000万人以上、500000以下のデータを抽出してください。
5 isinメソッドを使って都道府県で沖縄県と北海道のデータを抽出してください
6 containsメソッドを使って「川」を含む都道府県を抽出してください。
7 startswithメソッドを使って「北」から始まる都道府県を抽出して下さい。
8 endswithメソッドを使って「府」でおわる都道府県を算出してください。

それでは正解です。


1問目は答えはこちら。

pd.set_option(‘display.max_rows’, 10)

2問目は答えはこちら。

df[150:154]

3問目は答えはこちら。

df[(df[‘西暦(年)’] == 2015) & (df[‘人口(総数)’] >= 5000000)]

4問目は答えはこちら。

df = df.rename(columns={‘人口(総数)’: ‘population’})
df.query(‘population >= 10000000 or population <= 500000’)

5問目は答えはこちら。

df[df[‘都道府県名’].isin([‘沖縄県’,’北海道’])]

6問目は答えはこちら。

df[df[‘都道府県名’].str.contains(‘川’)]

7問目は答えはこちら。

df[df[‘都道府県名’].str.startswith(‘東’)]

8問目は答えはこちら。

df[df[‘都道府県名’].str.endswith(‘府’)]

みなさん正解できましたでしょうか?
全問正解しているといいな〜。
この動画では、DataFrameの特定の列や行、あるいは、特定の条件に一致するデータを抽出する方法を学んでいきました。
キノコードでは、pythonやPandasの他に、データ可視化のmatplotlibや人工知能のレッスンもアップしていく予定です。
気に入ってくださった方は、チャンネル登録をお願いします。
それでは、次回のレッスンでお会いしましょう。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」

CSVやExcelファイルはこちら

Jupyter Labのファイルはこちら