2015-05-22 69 views
1

我有一個有兩個指標變量列的數據框。我想創建一個第三列,它是兩個現有列的邏輯OR。我能夠,像這樣:熊貓中2個指標列的邏輯或

df  = DataFrame ({"a" : [1,0,0] , "b" : [0,0,1] }) 
df["c"] = (df["a"] | df["b"]).apply(lambda x : 1 if x else 0) 

通過(df["a"] | df["b"])生產的系列bool類型。這令我感到驚訝,因爲|是一個按位運算符,所以我預計該系列的類型爲int。因此,我必須執行apply(lambda ...)才能獲得所需的int列。

我是否正確地做了這件事,還是有一個更簡潔/大熊貓首選/ pythonic的方式?

+1

什麼版本numpy的,熊貓是你使用,因爲我無法重現你的布爾DF,它只是正常工作對我來說,我'運行numpy 1.9.1和熊貓0.16.1,調用'astype(int)'會解決你的問題,但我不能重現你的錯誤 – EdChum

+0

我很高興你問我的版本,它看起來像我的熊貓只是0.15.2。 'astype(int)'解決方案工作正常,但無論如何我現在都會升級。 –

回答

1

使用astype

df["c"] = (df["a"] | df["b"]).astype(int) 

|是不是真正的位運算符。它會調用方法__or__。 這可以根據需要實現。

所以這個:

df['a'] | df['b'] 

實際上是調用此:

df['a'].__or__(df['b']) 
+0

啊,所以'__or __()'是'''就像'__eq __()'是'==','串行'''__或__()'返回'bool'一樣,對嗎?這可以解釋它。我想沒有標準的對象方法是由'或'操作符觸發的,對嗎? –

+1

正確:https://docs.python.org/3.4/reference/datamodel.html#object.__or__ –

+0

明白了。所以'Series .__或__()'返回一個'bool'而不是'int'的決定是出於這樣一個事實,即必須對'Series'進行某種布爾比較,但沒有'object'方法對於'或','__or __()'方法和'|'運算符是唯一的出路嗎?這就解釋了爲什麼你不能'或'兩個'Series'實例?對不起所有的問題,只是想明白這一點。 –