データフレームに任意の行要素が含まれるかどうかチェック(行ごとのチェック)

How to do Mapping between Numpy Array and Pandas Dataframe? – StackOverflow

Pandasでこの手の処理がしたい場合は,除外マージを利用する.必ずしも最も効率的な方法ではないが,応用が利くので,類似のケースに適用可能だし,間違いが少ないと思う(Pandas.DataFrame.isinが用いられるケースではその方が効率的だが,必ずしも意図した処理を行えているかどうか).

import pandas as pd
import numpy as np


data = [[0, 10, 22000, 3], 
        [1, 15, 42135, 4], 
        [0, 14, 13526, 5],
        [0, 16, 32156, 3], 
        [1, 23, 13889, 5], 
        [0, 18, 18000, 6], 
        [0, 21, 13189, 2], 
        [1, 32, 58766, 2]] 
col = ['Gender', 'Age', 'Amount','Dependents']

arr = np.array([[1, 15, 42135, 4],
       [1, 23, 13889, 5],
       [0, 21, 13189, 2]])
m = pd.DataFrame(arr, columns=col)

df = (
    pd.DataFrame(data, columns=col)
    .merge(m, indicator=True, how='left')
    .replace({'_merge': {'left_only': 0, 'both': 1}})
    .rename(columns={'_merge': 'Good_Bad'})
)
df
    Gender  Age Amount  Dependents  Good_Bad
0   0   10  22000   3       0
1   1   15  42135   4       1
2   0   14  13526   5       0
3   0   16  32156   3       0
4   1   23  13889   5       1
5   0   18  18000   6       0
6   0   21  13189   2       1
7   1   32  58766   2       0

今のケースの様に,数値データの場合はNumpyで処理するのがリーズナブルチョイス.

def view1D(a):
    a = np.ascontiguousarray(a)
    void_dt = np.dtype((np.void, a.itemsize*a.shape[1]))
    return a.view(void_dt).ravel()


def isin_nd(a, b):
    A, B = view1D(a.reshape(a.shape[0], -1)), view1D(b.reshape(b.shape[0], -1))
    return np.isin(A, B)


np.column_stack((data, isin_nd(np.array(data), arr).view('i1')))
array([[    0,    10, 22000,     3,     0],
       [    1,    15, 42135,     4,     1],
       [    0,    14, 13526,     5,     0],
       [    0,    16, 32156,     3,     0],
       [    1,    23, 13889,     5,     1],
       [    0,    18, 18000,     6,     0],
       [    0,    21, 13189,     2,     1],
       [    1,    32, 58766,     2,     0]])
df = (
    pd.DataFrame(data, columns=col)
    .assign(Good_Bad=lambda df: isin_nd(df.to_numpy(), arr).view('u1'))
)
df
    Gender  Age Amount  Dependents  Good_Bad
0   0   10  22000   3       0
1   1   15  42135   4       1
2   0   14  13526   5       0
3   0   16  32156   3       0
4   1   23  13889   5       1
5   0   18  18000   6       0
6   0   21  13189   2       1
7   1   32  58766   2       0
広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください