2017-01-11 227 views
2

我有一個數據幀「DF」:熊貓 - 比較正/負值

x y 
0 1 -1 
1 -2 -3 
2 3 4 
3 4 5 
4 9 6 

我試圖確定x和y值的多少百分比是一致的在被積極或消極的方面。所以如果x是正數,y是正數,那將是一個正確的答案。如果x和y都是負數,那就是正確的。如果x和y不同,那就錯了。有沒有快速的方法來做到這一點?最終我只想知道所有行的百分比是否有正確的答案。

(PS有實際數據幀1M +行)

謝謝

+0

我們應該如何都能平等地對待行,其中一個或兩個值是'0'? – MaxU

+0

這種情況不會發生在我正在使用的數據中,但謝謝。 –

回答

6

如果我們比較的x*y >= 0產品 - 這應該給我們"good"行:

In [19]: df['x'].mul(df['y']).ge(0) 
Out[19]: 
0 False 
1  True 
2  True 
3  True 
4  True 
dtype: bool 


In [20]: df.loc[df['x'].mul(df['y']).ge(0)] 
Out[20]: 
    x y 
1 -2 -3 
2 3 4 
3 4 5 
4 9 6 

In [21]: len(df.loc[df['x'].mul(df['y']).ge(0)])/len(df) 
Out[21]: 0.8 

或建議通過@NickilMaveli更快,更「Pandaic」版本:

In [23]: df['x'].mul(df['y']).ge(0).mean() 
Out[23]: 0.80000000000000004 

同樣的想法,但使用df.eval()方法這個時候:

In [27]: df.eval('x * y >= 0').mean() 
Out[27]: 0.80000000000000004 
+3

'(df.x.mul(df.y).ge(0))。mean()'也許更快。 –

+1

@NickilMaveli,哇,這很聰明 - 我會將它添加到答案!謝謝! – MaxU

+0

我不知道這是否是預期的行爲,但是'x * y> = 0'會打開包含零的行,即(0,0),(0,1)和(0,-1)行都將被宣佈爲具有相同的符號。 – root