Pandas.DataFrameにおける複数列のブーリアン処理

Pandas DataFrame select rows based on values of multiple columns whose names are specified in a list – StackOverflow

このpandas.DataFrame.queryの使い方は参考になるなと思った.

ただ,回答の1:1で対応している時に,numpy.logical_and.reduceを用いるのは冗長でリーズナブルでは無い(複数の条件があって初めて意味があるのであって,1:1の対応があるという事は,それは1つの条件としてみなせる訳だから).文字列処理(numpy.chararray)の様に,シリアルに処理されるケースでは,関連1の様にnumpy.logical_and.reduceの方がリーズナブルだが,数値の場合はブロードキャストされて内部的に並列処理されるので,(今のケースや関連2の様な)不要なループは無い方が良い.

import pandas as pd
import numpy as np
import perfplot


perfplot.show(
    setup=lambda N: pd.DataFrame(
        {
            'z':np.random.binomial(n=1,p=0.5,size=N), 
            'x':np.random.binomial(n=1,p=0.5,size=N), 
            'u':np.random.binomial(n=1,p=0.5,size=N), 
            'y':np.random.binomial(n=1,p=0.5,size=N)
        }
    ),
    kernels=[
        lambda df: df[df[['z', 'x']].eq([0, 1]).all(1)],
        lambda df: df[(df[['z','x']].values==[0, 1]).all(1)],
        lambda df: df[np.logical_and.reduce([df[c]==v for c, v in zip(['z', 'x'], [0, 1])])],
        lambda df: df.query(' & '.join([f'{c}=={v!r}' for c,  v in zip(['z', 'x'], [0, 1])]))
    ],
    labels=['basis', 'values', 'numpy.logical_and.reduce', 'query'],
    n_range=[2**k for k in range(0, 25)],
    xlabel='N',
    logx=True,
    logy=True
)

ダウンロード

 
 
関連:
[1] Pandasデータフレーム内の任意の文字列に合致する行を選択 – numpy/pandas/pythonにおける文字列のブーリアン演算

[2] AND and OR operatorを用いるPythonicな方法 – データフレーム内の任意列の論理積が0となる行を選択して集計(グルーピングして合計)

カテゴリー: 未分類 パーマリンク

Pandas.DataFrameにおける複数列のブーリアン処理 への2件のフィードバック

  1. ピンバック: pandas.DataFrame.applyは(時空間効率の観点からは)使用するべきではない – 使用すべき明確な理由がない限りpandas.DataFrame.applyはリーズナブルチョイスになり得ない | 粉末@それは風のように

  2. ピンバック: pandas.DataFrame.applyは(時空間効率の観点からは)使用するべきではない – 使用すべき明確な理由がない限りpandas.DataFrame.applyはリーズナブルチョイスになり得ない | 粉末@それは風のように

コメントを残す

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

WordPress.com ロゴ

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

Google フォト

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

Twitter 画像

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

Facebook の写真

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

%s と連携中

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