2017-06-08 2 views
3

不確実性(dA、dB、...)を持つ実際のメジャーと対応する列数(A、B、...)を持つ複数の列を含むデータフレーム(df)これらの列のそれぞれのために:複数列のパンダデータフレームブールマスク

 A   B 
0 False  True 
1 True  True 
2 True  True 
3 True  False 

A B dA  dB 
0 -1 3 0.31 0.08 
1 2 -4 0.263 0.357 
2 5 5 0.382 0.397 
3 -4 -0.5 0.33 0.115 

私は

df[["A","B"]].apply(lambda x: x.abs()-5*df['d'+x.name] > 0) 

これはブール配列を返します私の定義に従って、有効な測定列の値を見つけるために関数を適用します

この配列を使用して、単一の列内で条件が真であるデータフレーム内の行を選択したいとします。 A - >行1-3を含み、すべての入力列について条件が真である行を見つける。行および。 パンダでこれを行う効率的な方法はありますか?基本となる配列データを使用して

答えて

1

あなたは、元のデータフレームから選択するboolean型のインデックスにあなたの適用の文の結果を使用することができます - 各列に沿ってall()減少とすべて一致して行を取得

を:上:次のように今

 A  B 
0 False True 
1 True True 
2 True True 
3 True False 

、あなたの元datafameから行を選択するには、この配列を使用することができます

AがTrueの選択:AまたはBのいずれかに該当する

df[results.A] 

    A B  dA  dB 
1 2 -4.0 0.263 0.357 
2 5 5.0 0.382 0.397 
3 -4 -0.5 0.330 0.115 

選択:

df[results.any(axis=1)] 

    A B  dA  dB 
0 -1 3.0 0.310 0.080 
1 2 -4.0 0.263 0.357 
2 5 5.0 0.382 0.397 
3 -4 -0.5 0.330 0.115 

を選択し、すべての列真:

df[results.all(axis=1)] 

    A B  dA  dB 
1 2 -4.0 0.263 0.357 
2 5 5.0 0.382 0.397 
+0

まさに!これは私が最後に使ったものです。あなたの努力もありがとう。 – Fourier

+0

あなたはようこそ –

1

、ベクトル化のアプローチは、そうするようなものだ -

cols = ['A','B'] # list holding relevant column names 
dcols = ['d'+i for i in cols] 
out = np.abs(df[cols].values) - 5*df[dcols].values > 0 

サンプル実行 -

In [279]: df 
Out[279]: 
    A B  dA  dB 
0 -1 3.0 0.310 0.080 
1 2 -4.0 0.263 0.357 
2 5 5.0 0.382 0.397 
3 -4 -0.5 0.330 0.115 

In [280]: cols = ['A','B'] # list holding relevant column names 
    ...: dcols = ['d'+i for i in cols] 
    ...: out = np.abs(df[cols].values) - 5*df[dcols].values > 0 
    ...: 

In [281]: out 
Out[281]: 
array([[False, True], 
     [ True, True], 
     [ True, True], 
     [ True, False]], dtype=bool) 

NaNsとして無効なものを設定することで有効なものを抽出するために、我々は、使用可能np.where -

In [293]: df[cols] = np.where(out, df[cols], np.nan) 

In [294]: df 
Out[294]: 
    A B  dA  dB 
0 NaN 3.0 0.310 0.080 
1 2.0 -4.0 0.263 0.357 
2 5.0 5.0 0.382 0.397 
3 -4.0 NaN 0.330 0.115 

また、

results = df[["A","B"]].apply(lambda x: x.abs()-5*df['d'+x.name] > 0) 

あなたのブール配列を返します。

In [283]: np.flatnonzero(out.all(axis=1)) 
Out[283]: array([1, 2]) 
+0

とても素敵なアプローチが、それだけで気分が悪いのですが、これはまだ大丈夫です。しかし、単一の列で作業する場合、これをデータフレーム@Divakarにどのようにマッピングすればよいでしょうか? – Fourier

+0

@Fourier正確に地図に戻したいものは何ですか? boolean配列 'out'? 'df [cols] = np.where(out、df [cols]、np.nan)'のちょうど作られた編集はあなたのために働くでしょうか? – Divakar

+0

私が読んでいる間、np.whereがまだページに載っていないなど、あなたの答えの一部が残念です。 NVM、mea culpa。 – Fourier