pandas:【行選択の基本】ブールインデックス参照
目次
はじめに
ここに書いてあること
- ブールインデックス参照を使った行抽出方法
- SQL文で言うとWHERE句に該当する
前提
- 用語
- ブールインデックス参照とは
- インデックス列とは
- 操作
- データフレームの作成
- 列の指定方法
データ準備
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(10,100,(5,5)),columns=['a','b','c','d','e'])
print(df)
print(df.shape)
print(df.index)
a b c d e 0 36 51 25 12 11 1 55 34 81 32 75 2 33 86 69 25 15 3 92 19 28 44 22 4 11 98 43 33 58 (5, 5) RangeIndex(start=0, stop=5, step=1)
- データフレームのサイズ(3,4)
基本
ブールインデックス参照での行の取り出し例
arr = [True,False,True,True,False]
sample = df[arr]
print(sample)
a b c d e 0 36 51 25 12 11 2 33 86 69 25 15 3 92 19 28 44 22
- インデックス列(一番左)に注目
- 0~2まで
- ステップ数1ずつ
- 並んだデータ3個
データ参照のポイント
- bool型の配列をどのように作成するか
- 以降はbool型配列の作成方法について説明
サンプルコード(bool型配列の作成)
利用できるもの
手作業
arr1 = [True,False,True,True,False]
arr2 = np.array([True,False,True,True,False])
print(arr1)
print(type(arr1))
print(arr2)
print(type(arr2))
[True, False, True, True, False] <class 'list'> [ True False True True False] <class 'numpy.ndarray'>
- データ件数が少ない場合
- リストやndarray(NumPy配列)
インデックス列
arr = df.index < 3
print(arr)
print(type(arr))
[ True True True False False] <class 'numpy.ndarray'>
- ndarray(NumPy配列)になる
列
arr = df.b > 50
print(arr)
print(type(arr))
0 True 1 False 2 True 3 False 4 True Name: b, dtype: bool <class 'pandas.core.series.Series'>
- Seriesになる
bool型配列の作成例
- 以降の例はインデックス列使用で統一した
- 列を利用する場合は文字列も利用できる
特定の1つ
arr = df.index==3
print(arr)
[False False False True False]
- インデックス番号3(0から開始)のみがTrue
特定の1つ以外
arr = df.index!=3
print(arr)
[ True True True False True]
- インデックス番号3(0から開始)以外がTrue
不等号
arr = df.index>2
print(arr)
[False False False True True]
- インデックス番号3,4(0から開始)がTrue
否定
arr1 = df.index==0
arr2 = ~(df.index==0)
print(arr1)
print(arr2)
[ True False False False False] [False True True True True]
- 頭に「~」チルダを付ける
- 不等号の場合は()を付けるのを忘れずに(メソッドの場合は不要)
- True/Falseが逆転する
複数指定
arr = df.index.isin([1,4,5])
print(arr)
[False True False False True]
- インデックス番号1,4,5(0から開始)がTrue
- [1,4,5]のようにリストで指定する
補足
列の抽出と組み合わせた例(行と列の指定)
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(20).reshape(4,5), columns=['a','b','c','d','e'])
print(df)
print(df.shape)
a b c d e 0 0 1 2 3 4 1 5 6 7 8 9 2 10 11 12 13 14 3 15 16 17 18 19 (4, 5)
- データフレームのサイズ(4,5)
データ抽出(行と列の指定)
a = df[df.index.isin([0,3])][['b','c','e']]
print(a)
print(a.shape)
b c e 0 1 2 4 3 16 17 19 (2, 3)
- (4,5)のサイズから(2,3)のサイズになった
- インデックス番号が0と3の2行
- 列名が[b,c,e]の3列
