pandas:【isin,isnull】条件付き行の抽出方法
はじめに
ここで説明していること
- 特定の列の条件指定
- 行データを抽出する
前提
- データフレーム作成
- 列名の指定方法
- pandas:【基本】列の指定(Select句)
- ここでは「df.a」のパターンを利用
- boolインデックス参照
サンプルコード
df.isin
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(10,20,(5,3)), columns=['p','q','r'])
print(df)
print(df.shape)
p q r 0 18 18 13 1 17 17 10 2 14 12 15 3 12 12 12 4 11 10 18 (5, 3)
- (5,3)のデータを作成
- 列名がp,q,r
復習(1行選択)
arr = df.p==12
a = df[arr]
print(arr)
print(a)
0 False
1 False
2 False
3 True
4 False
Name: p, dtype: bool
p q r
3 12 12 12
- boolインデックス参照で3行目(12)だけがTrue
- 結果はインデックス番号3の行が抽出される
- 「==」は「>」「<=」などの不等号が利用できる
(不等号の場合は複数行の選択)
isinでboolインデックス作成
arr = df.q.isin([12,17])
print(df)
print(arr)
p q r 0 18 18 13 1 17 17 10 2 14 12 15 3 12 12 12 4 11 10 18 0 False 1 True 2 True 3 True 4 False Name: q, dtype: bool
- q列が12,17の行がTrueになっている
- [12,17]
- isinの引数にリストを渡す
- リストに指定された条件で
- インデックス番号1,2,3の3行がTrue
- データが文字列の場合は['aa’,’bb’]のように指定できる
データ抽出結果の確認
a = df[arr]
print(a)
print(a.shape)
p q r 1 17 17 10 2 14 12 15 3 12 12 12 (3, 3)
- インデックス番号が1,2,3の3行が抽出された
df.isnull
データ作成
import pandas as pd
df = pd.DataFrame({'id':['01','02','03'],'value':[10,np.nan,np.nan]})
print(df)
print(df.shape)
id value 0 01 10.0 1 02 NaN 2 03 NaN (3, 2)
- サイズ(3,2)のデータ(データフレーム)を作成
- インデックス番号1,2のvalue列が「NaN」になっている
isnullでboolインデックス作成
arr = df.value.isnull()
print(arr)
0 False 1 True 2 True Name: value, dtype: bool
- value列がNaNの列のインデックス番号のデータがTrue
データ抽出結果の確認
a = df[arr]
print(a)
id value 1 02 NaN 2 03 NaN
- インデックス番号が1,2の2行が抽出された
発展
列を指定しないでisinするとどうなる?
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(10,20,(3,6)), columns=['p','q','r','s','t','u'])
print(df)
print(df.shape)
p q r s t u 0 14 10 19 16 12 14 1 11 15 13 14 14 13 2 17 11 11 17 17 10 (3, 6)
- 10と14の箇所に注目
列名を指定せずにisinを使う
arr = df.isin([10,14])
print(arr)
p q r s t u 0 True True False False False True 1 False False False True True False 2 False False False False False True
- 列指定と同様にisinにリストで渡す
- [10,14]
- 10と14のデータのみを抽出する指定
- データの該当箇所がTrueになっていることが分かる
このboolインデックスを引数にすると
a = df[arr]
print(a)
p q r s t u 0 14.0 10.0 NaN NaN NaN 14.0 1 NaN NaN NaN 14.0 14.0 NaN 2 NaN NaN NaN NaN NaN 10.0
- Trueの箇所だけが数値になった
- 好奇心からちょっと遊んでみました
