2017-07-25 27 views
1

我一直在應用一些關於我的代碼庫的二進制布爾運算符,並遇到了一個令我感到驚訝的bug。我重建一個最小的工作示例演示以下行爲......對於持有不同索引的具有相同長度元素的pandas元素二元布爾操作數,規則是什麼?

import pandas 
s = pandas.Series([True]*4) 
d = pandas.DataFrame({ 'a':[True, False, True, False] , 'b':[True]*4 }) 

print(d) 
     a  b 
0 True True 
1 False True 
2 True True 
3 False True 

print(s[0:2]) 
0 True 
1 True 
dtype: bool 

print(d.loc[ d['a'] , 'b' ]) 
0 True 
2 True 
dtype: bool 

print(s[0:2] & d.loc[ d['a'] , 'b' ]) 
0  True 
1 False 
2 False 

最後這句話的價值在其產生3元的驚喜抓住我完全。在這裏實現索引的影響我手動重置索引以產生我期望的結果。

s[0:2].reset_index(drop=True) & d.loc[ d['a'] , 'b' ].reset_index(drop=True) 
0 True 
1 True 

不用說我需要重新審視的文件,並獲得抓地力,瞭解索引規則在這裏如何應用。任何人都可以一步一步解釋這個操作符如何處理混合索引?

=============================================

只是爲了增加對那些從類似[R背景的人相比,R的data.frame相當於操作得到我期望的是什麼...

> a = c(TRUE,FALSE,TRUE,FALSE) 
> b = c(TRUE,TRUE,TRUE,TRUE) 
> 
> d = data.frame(a, b) 
> d 
     a b 
1 TRUE TRUE 
2 FALSE TRUE 
3 TRUE TRUE 
4 FALSE TRUE 
> s = c(TRUE,TRUE,TRUE,TRUE) 
> s 
[1] TRUE TRUE TRUE TRUE 
> 
> d[ d$a , 'b'] 
[1] TRUE TRUE 
> 
> s[0:2] 
[1] TRUE TRUE 
> s[0:2] & d[ d$a , 'b'] 
[1] TRUE TRUE 

回答

2

你比較兩個系列具有不同指數

s[0:2] 

0 True 
1 True 
dtype: bool 

d.loc[ d['a'] , 'b'] 

0 True 
2 True 
dtype: bool 

pandas需要對齊索引然後進行比較。

s[0:2] & d.loc[ d['a'] , 'b'] 

0  True # True from both indices therefore True 
1 False # Only True from s[0:2] and missing from other therefore False 
2 False # Only True from d and missing from other therefore False 
dtype: bool 
+0

哇,這個索引方案是來自R嚴格元素操作的全新遊戲。我會在我的問題中整合一些R例子來提供一些比較。感謝您的基本技巧。 – jxramos

+2

您仍然可以使用底層numpy數組(在Series/DataFrame之一上調用'.values'屬性)進行元素操作。 – ayhan

+0

哇,索引對齊是一個強大的功能...在這裏找到了一個很好的演示和解釋[我需要知道什麼關於熊貓索引? (第2部分)](https://www.youtube.com/watch?v=15q-is8P_H4)。如果我沒有弄錯,在R中沒有類似的東西,我認爲R的[回收規則](https://cran.r-project.org/doc/manuals/r-release/R-intro.html#The - 回收規則)會在示例中插入一個子集操作的應用,該操作應用於較大的集合,其中索引對齊首先發生,並且NaN在其他地方被填充。 – jxramos

相關問題