pandas:【~(チルダ)】否定条件での行抽出
はじめに
ここで説明していること
- 行データ抽出方法
- 否定の条件指定(~以外、~でない、~を含まない)
前提
- データフレーム作成
- 列名の指定方法
- pandas:【基本】列の指定(Select句)
- ここでは「df['a’]」のパターンを利用
- boolインデックス参照
- isin
サンプルコード
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(10,100,(5,4)), columns=['p','q','r','s'])
print(df)
print(df.shape)
p q r s 0 18 34 77 97 1 89 58 20 62 2 63 76 24 44 3 34 25 70 68 4 26 19 96 12 (5, 4)
- (5,4)サイズのデータを作成
- 列名はp,q,r,s
- この後、ある列のデータを条件に行を抽出
~に一致しない、~以外
boolインデックスを作成
arr = df['p'] != 63
print(arr)
0 True 1 True 2 False 3 True 4 True Name: p, dtype: bool
- p列が63以外の行がTrueになっている
データ抽出結果
a = df[arr]
print(a)
print(a.shape)
p q r s 0 18 34 77 97 1 89 58 20 62 3 34 25 70 68 4 26 19 96 12 (4, 4)
- インデックス番号0,1,3,4が抽出された
~ではない
boolインデックスを作成
arr = ~(df['q'] == 25)
print(arr)
0 True 1 True 2 True 3 False 4 True Name: q, dtype: bool
- インデックス番号3がq列25になっている
- df['q’] == 25なら
- インデックス番号3がTrue
- ~(df['q’] == 25)
- 「~」で否定
- インデックス番号3以外がTrue
データ抽出結果
b = df[arr]
print(b)
print(b.shape)
p q r s 0 18 34 77 97 1 89 58 20 62 2 63 76 24 44 4 26 19 96 12 (4, 4)
- インデックス番号0,1,2,4が抽出された
~を含まない(not in)
boolインデックスを作成
arr = ~(df['r'].isin([20,77,96]))
print(arr)
0 False 1 False 2 True 3 True 4 False Name: r, dtype: bool
- [20,77,96]
- 行抽出結果に含みたくないものをリスト指定
- 指定にはisinを利用する
- df['r’].isin([20,77,96])なら
- インデックス番号0,1,4がTrue
- ~(df['r’].isin([20,77,96]))
- 「~」で否定
- インデックス番号2,3がTrue
データ抽出結果
c = df[arr]
print(c)
print(c.shape)
p q r s 2 63 76 24 44 3 34 25 70 68 (2, 4)
- インデックス番号2,3が抽出された
