パハットノート

※当サイトではGoogleアドセンス広告を利用しています

Pandas DataFrame 指定した行を除外する





概要

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]