概要
pandasのDataFrameにおけて1, 3行目を取り出すは簡単にできますが、これらを除外する処理の実装に一苦労したのでまとめておきます。
基本的な使用方法
データの宣言
import numpy as np import pandas as pd df = pd.DataFrame({ 'A': np.arange(5), 'B': np.arange(5)*2 }) df
残したい行のnumpy配列を宣言
- np.isin(a, b)でbについてaにも存在する要素をTrueとした配列を返す。
- np.logical_notでnumpy配列の否定(NOT)を取る。
# numpy配列[0, 1, …, 4]を作成 row_index = np.arange(len(df)) # array([0, 1, 2, 3, 4]) # 除外する行を指定し、row_indexの該当箇所のみTrueにする remove_index = np.array([1, 3]) bool_index = np.isin(row_index, remove_index) # array([False, True, False, True, True]) # bool_indexのNOTを取ることで、残したい行のみTrueにする select_index = np.logical_not(bool_index) # array([ True, False, True, False, False])
除外できたか確認
# ilocを使用して特定の行を選択
selected_data = df.iloc[select_index]
selected_data
応用例(kFold)との併用
意味のない処理ですが、train_index以外を求めるとtest_indexと一致することを確認しています。
from sklearn.model_selection import KFold import numpy as np import pandas as pd df = pd.DataFrame({ 'A': np.arange(6), 'B': np.arange(6)*2 }) kf = KFold(n_splits=3, shuffle=True, random_state = 0) # numpy配列[0, 1, …, 5]を作成 row_index = np.arange(len(df)) # select_indexとtest_indexが同じになることを確認 for (train_index, test_index) in kf.split(df): # 除外する行を指定し、row_indexの該当箇所のみTrueにする bool_index = np.isin(row_index, train_index) # bool_indexのNOTを取ることで、残したい行のみTrueにする select_index = np.logical_not(bool_index) print(f'select_index = {row_index[select_index]}, test_index = {test_index}')
実行結果
select_index = [2 5], test_index = [2 5] select_index = [1 3], test_index = [1 3] select_index = [0 4], test_index = [0 4]