Open In Colab

ブールインデックス#

本節では真理値(ブール値)を利用したデータのアクセス方法について学びます。

import numpy as np
import pandas as pd
rng = np.random.default_rng(1)
ser = pd.Series(rng.integers(-10, 10, size=10))
df = pd.DataFrame(rng.integers(-10, 10, size=(10, 2)), columns=["a", "b"])
ser
0    -1
1     0
2     5
3     9
4   -10
5    -8
6     6
7     8
8    -6
9    -4
dtype: int64
df
a b
0 7 -2
1 -5 6
2 -5 -2
3 2 0
4 -9 -10
5 7 5
6 6 0
7 6 -4
8 -1 5
9 -8 -4

真理値によるアクセス#

Seriesオブジェクト ser から0より大きい要素を抽出する処理を検討します。.locインデクサおよび.ilocインデクサに真理値を要素としたarray-likeオブジェクトを渡すと、 True に該当する要素のみを返します。

ser.loc[[False, False, True, True, False, False, True, True, False, False]]
2    5
3    9
6    6
7    8
dtype: int64

演算子による真理値の取得#

SeriesおよびDataFrameにはブロードキャスト演算が行えます、次のコードでは > 演算子を利用して、 ser オブジェクトの要素が 0 より大きい要素を True 、それ以外を False のSeriesを生成しています。

ser > 0
0    False
1    False
2     True
3     True
4    False
5    False
6     True
7     True
8    False
9    False
dtype: bool

データの抽出#

前述の2つのコードを組み合わせることにより、条件に合致したデータを抽出できます。

ser.loc[ser > 0]
2    5
3    9
6    6
7    8
dtype: int64

同様に、DataFrameのインデクサにも真理値を利用した抽出ができます。次のコードでは df オブジェクトから「a」列の値が0より大きい行を True としたSeriesを返しています。

df.loc[:, "a"] > 0
0     True
1    False
2    False
3     True
4    False
5     True
6     True
7     True
8    False
9    False
Name: a, dtype: bool

次のコードでは df オブジェクトから「a」列の値が0より大きい行を抽出しています。

df.loc[df.loc[:, "a"] > 0, :]
a b
0 7 -2
3 2 0
5 7 5
6 6 0
7 6 -4

複数の条件を設定する場合には () で括ります。And条件は & 演算子、Or条件は | 演算子を使います。次のコードでは df オブジェクトから「a」列の値が0より小さく、かつ「b」列の値が3より大きい行を抽出しています。

df.loc[(df.loc[:, "a"] < 0) & (df.loc[:, "b"] > 3), :]
a b
1 -5 6
8 -1 5

練習問題1#

df オブジェクトの行のインデックス(ラベル)が1の行で、値が5より大きい列を抽出してください。

2 3
0 2 3
1 6 7
2 10 11
3 14 15
df2 = pd.DataFrame(np.arange(16).reshape(4, 4))
df2
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
# 解答セル