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列


Posted by futa