pandas:【~(チルダ)】否定条件での行抽出


はじめに

ここで説明していること

  • 行データ抽出方法
  • 否定の条件指定(~以外、~でない、~を含まない)

前提

サンプルコード

データ作成

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が抽出された


Posted by futa