pandas:【isin,isnull】条件付き行の抽出方法


はじめに

ここで説明していること

  • 特定の列の条件指定
  • 行データを抽出する

前提

サンプルコード

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の箇所だけが数値になった
  • 好奇心からちょっと遊んでみました


Posted by futa