Pandasによるデータの抽出方法
今回の講義ではDataFrameの特定の列や行、
特定の条件に一致するデータを抽出する方法を学習します。
まずは前回同様、データを読み込みます。
データにつきましても前回同様
下記URLからダウンロードできます。
1920年から2015年までの全国の人口推移のデータ
データはjupyternotebookと同じフォルダに保存します。
ただ、どうゆうわけかキノコードさんと同じ列数の
データを見つける事ができませんでした。
講義とは若干異なってきますが、臨機応変にやっていきたいと思います。
ではpandasインポート、表示する行数の設定、
データの読み込みを行います。
import pandas as pd
pd.set_option('display.max_columns', None) # 最大表示列数
pd.set_option('display.max_rows', 5) # 最大表示行数
df = pd.read_csv('c01.csv', encoding = 'shift-jis')
df
次にindex番号の変更を行います。
詳しい理由は現段階ではわかりませんが、
通常0,1,2,3,4と割り振られるindex番号を1,2,3,4と変えます。
df.index = df.index + 1
df
すべてのindexに1を足すことによって
1,2,3,4,5の1から始まるindexに変更されます。
DataFrameをスライスでデータ抽出
スライスとは、データの一部分を切り取って
データ取得する仕組みのことらしいです。
コードでいうと
df[0:3]
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 注 人口(総数) 人口(男) 人口(女)
1 00 全国 大正 9.0 1920.0 NaN 55963053 28044185 27918868
2 01 北海道 大正 9.0 1920.0 NaN 2359183 1244322 1114861
3 02 青森県 大正 9.0 1920.0 NaN 756454 381293 375161
たった一行のこのコードで上から3行のデータを
抽出することができました。
ちなみにこのdf[0:3]は0スタートの場合は0を省略することができ、
df[:3]で同じ結果を出力することができます。
他にも途中の数行を抽出したい場合、たとえば
10〜14行目を抽出したい場合は df[9:14]
101〜105行目を抽出したい場合 df[100:105]
となります。
スライスでデータ抽出してSeriesを作成
DataFrameから一列データを取り出すとSeriesになります。
四角括弧の中に抽出したいカラム名を入れます。
今回は表示する行数を指定する為に:5としています。
df['人口(総数)'][:5]
1 55963053
2 2359183
3 756454
4 845540
5 961768
Name: 人口(総数), dtype: object
このやり方ですと、Seriesになりますが、
DataFrameのままでデータを扱いたい場合は
四角括弧を二重にします。
df[['人口(総数)']][:5]
人口(総数)
1 55963053
2 2359183
3 756454
4 845540
5 961768
条件でデータ抽出
四角括弧で検索したい列のカラム名を指定して
その横にそのまま条件式を入れます。
df[df['西暦(年)'] == 2015]
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 注 人口(総数) 人口(男) 人口(女)
931 00 全国 平成 27.0 2015.0 NaN 127094745 61841738 65253007
932 0A 人口集中地区 平成 27.0 2015.0 NaN 86868176 42363423 44504753
... ... ... ... ... ... ... ... ... ...
979 46 鹿児島県 平成 27.0 2015.0 NaN 1648177 773061 875116
980 47 沖縄県 平成 27.0 2015.0 NaN 1433566 704619 728947
50 rows × 9 columns
条件を2つ入れる and条件
df[(df['西暦(年)'] == 2015) & (df['都道府県名'] == '東京都')]
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 注 人口(総数) 人口(男) 人口(女)
946 13 東京都 平成 27.0 2015.0 NaN 13515271 6666690 6848581
or条件
df[(df['西暦(年)'] == 2010) | (df['西暦(年)'] == 2015)]
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 注 人口(総数) 人口(男) 人口(女)
881 00 全国 平成 22.0 2010.0 NaN 128057352 62327737 65729615
882 0A 人口集中地区 平成 22.0 2010.0 NaN 86121462 42051390 44070072
... ... ... ... ... ... ... ... ... ...
979 46 鹿児島県 平成 27.0 2015.0 NaN 1648177 773061 875116
980 47 沖縄県 平成 27.0 2015.0 NaN 1433566 704619 728947
100 rows × 9 columns
OR条件でのデータ抽出は、「|(パイプライン、縦棒)」でできます。
特定の値に一致するデータ抽出するisinメソッド(複数条件)
df[df['西暦(年)'].isin([2010,2015])]
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 注 人口(総数) 人口(男) 人口(女)
881 00 全国 平成 22.0 2010.0 NaN 128057352 62327737 65729615
882 0A 人口集中地区 平成 22.0 2010.0 NaN 86121462 42051390 44070072
... ... ... ... ... ... ... ... ... ...
979 46 鹿児島県 平成 27.0 2015.0 NaN 1648177 773061 875116
980 47 沖縄県 平成 27.0 2015.0 NaN 1433566 704619 728947
100 rows × 9 columns
こちらのコードですと、結構スマートに抽出できてる感じです。
特定の値を含むデータを抽出するcontainsメソッド
個人的に今日勉強してみて、便利な機能だなぁ~と感心しました。
都道府県の名前で、例えば感じの'山'を含んでる都道府県を抽出できたりします。
分一致する行を抽出するには、
PandasのSeriesのstrメソッドと、
抽出したい文字列の場所の条件に応じて、
containメソッド、
endswithメソッド、
startswithメソッドを組み合わせて使えばよいみたいです。
df['都道府県名'].str.contains('山')
1 False
2 False
...
981 NaN
982 NaN
Name: 都道府県名, Length: 982, dtype: object
コメント