ブールインデックス
Contents
ブールインデックス#
本節では真理値(ブール値)を利用したデータのアクセス方法について学びます。
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 |
# 解答セル