2016-08-16 30 views
1

私はDATAFRAMEとシリーズがあります:私は両方の要素がTrueかどうかを確認するために、行によってシリーズの行に対して、各列を比較したい異なる軸に沿って論理演算子の番組

np.random.seed(0) 
df = pd.DataFrame(np.random.binomial(1, 0.3, (5, 4)).astype(bool)) 
ser = pd.Series(np.random.binomial(1, 0.3, 5).astype(bool)) 
df 
Out: 
     0  1  2  3 
0 False True False False 
1 False False False True 
2 True False True False 
3 False True False False 
4 False True True True 

ser 
Out: 
0  True 
1  True 
2 False 
3  True 
4 False 
dtype: bool

を。私はdf.mul(ser, axis=0)でこれを行うことができます

  0  1  2  3 
0 False True False False 
1 False False False True 
2 False False False False 
3 False True False False 
4 False False False False

が、それは警告発生します:結果がでなければなりません

UserWarning:「*」演算子は ためnumexprによってサポートされていないため、Pythonの空間で評価を代わりに '&'を使用してください

これは、操作が遅くなると思います。選択肢はありますか?

答えて

2

この計算を使用して、numpyのアレイとnumpyの放送でこれを計算することができ、アレイベースの(インデックスのないアラインメントは必要ラベルなし)、 あるので:ここ

np.logical_and(df.values, ser.values[:, None]) 

は、いくつかの速度の比較であります選択肢:

import numpy as np 
import pandas as pd 

N, M = 500, 400 
np.random.seed(0) 
df = pd.DataFrame(np.random.binomial(1, 0.3, (N, M)).astype(bool)) 
ser = pd.Series(np.random.binomial(1, 0.3, N).astype(bool)) 

In [60]: %timeit pd.DataFrame(np.logical_and(df.values, ser.values[:, None]), columns=df.columns, index=df.index) 
10000 loops, best of 3: 93.4 µs per loop 

In [51]: %timeit pd.DataFrame(df.values * ser.values[:,None], columns=df.columns, index=df.index) 
10000 loops, best of 3: 94.4 µs per loop 

In [47]: %timeit df.mul(ser, axis=0) 
UserWarning: evaluating in Python space because the '*' operator is not supported by numexpr for the bool dtype, use '&' instead 
10000 loops, best of 3: 166 µs per loop 

In [46]: %timeit df.apply(lambda x: x & ser) 
10 loops, best of 3: 135 ms per loop