2017-04-13 48 views
1

我有一個布爾熊貓數據框,如下轉換布爾數據幀,以二進制數陣列

aaa = pd.DataFrame([[False,False,False], [True,True,True]]) 

我想將它轉換爲二進制數陣列,該數據幀「AAA」, 結果是[000111 ]

如何實現此轉換?

任何幫助將不勝感激。由於

回答

3

你可以這樣做:

aaa = pd.DataFrame([[False,False,False], 
         [True,True,True]]) 
aaa=aaa.astype(int) 

然後aaa

0 1 2 
0 0 0 0 
1 1 1 1 

如果你想獲得該陣列['000','111']你可以這樣做:

aaa = pd.DataFrame([[False,False,False], 
         [True,True,True]]) 
aaa=aaa.astype(int).astype(str) 
[''.join(i) for i in aaa.values.tolist()] 
1

可以int後轉換和strnumpy arrayvalues然後sum

print (aaa.astype(int).astype(str).values.sum(axis=1)) 
['000' '111'] 
1

您可以通過一個bit shifted operator相乘來模擬兩個總和,然後將其轉換成二進制

aaa.mul(np.arange(3)[::-1] << 1).sum(1).apply(bin) 

0  0b0 
1 0b110 
dtype: object 

注意權力如何np.arange(3)[::-1] << 12

連續權力
array([4, 2, 0]) 

您可以進一步操作str操作

aaa.mul(
    np.arange(3)[::-1] << 1 
).sum(1).apply(bin).str.replace('0b', '').str.zfill(3) 

0 000 
1 110 
dtype: object 
0

我會做下列之一:

a.astype(int).astype(str).sum(axis=1).astype(int).astype(str) 

但是這是一個有點過分重新輸入我的口味。

另一種可能是使用應用:

a.astype(int).astype(str).apply(lambda x: ''.join(list(x))) 

但似乎什麼乾淨的,在我看來,以獲得通過乘法所需數量,然後將其轉換成二進制:

a.dot([4, 2, 1]).map(lambda x: bin(x)) 
當然

,如果你不想在開始的'0b',你只是使用

a.dot([4, 2, 1]).map(lambda x: bin(x)[2:]) 
+0

乘法是一個好主意! – faithefeng