2017-04-30 95 views
-1

我正在爲機器學習編寫一個數據預處理器,它需要將布爾數據視爲類別,而不是試圖將1視爲大於0.在導入csv表與Pandas DataFrame後,我想要確定列是布爾並將它們轉換爲布爾類型,而無需遍歷所有數字列來執行此操作。熊貓有意將布爾列解釋爲'int64',但我還沒有找到任何現有的方法來解決這個問題。如何檢測數值類型的數組是否只包含布爾值?

我試過numpy array safe casting,但它失敗,因爲不是檢查是否有不適合的布爾任何值,它只是拒絕任何類型垂頭喪氣,:

import pandas as pd 
df = pd.DataFrame({'a':[1, 0, 1]})  
numpy_array = df.values  
safe_booleans = numpy_array.astype(bool, casting='safe') 

不能從D投陣列(「的Int64」),根據該規則>「安全」

如果我刪除「安全」鑄造,然後它的工作原理D型(「布爾」),但我需要「安全」的,因爲還有非布爾列,否則astype會變成帶有los的布爾值的數據。

非常感謝,如果你能指出我的錯誤或建議其他方法將數值列/數組只有布爾值轉換爲布爾類型。

+1

*「我想安全地下注,以便不將任何非布爾特性轉換爲布爾值。」*我很困惑。您嘗試轉換爲布爾值的值是否始終爲0和1?如果不是,你期望把結果轉換爲布爾值是什麼? –

+2

astype的文檔中的註釋說:「從NumPy 1.9開始,如果在'safe'轉換模式下,要轉換的字符串dtype時間不足以保存integer/float數組的最大值,則astype方法現在會返回一個錯誤正在鑄造「。這很清楚:bool不能正確保存大於1的值,更不用說int64的最大值了。 – Evert

+0

讓我們假設通過布爾值來表示你的意思是1或0,如果他們不是這樣的話,你希望行爲是什麼? –

回答

0

現在我寫了一個迭代來解決這個問題:

import pandas as pd 
table = pd.DataFrame({'A':[1, 0, 1], 
         'B':[1, 2, 3], 
         'C':[True, True, False], 
         'D':['a', 'b', 'c']}) 
for column in range(table.shape[1]): 
    if table.iloc[:,column].isin([0, 1]).all(): 
     table.iloc[:,column] = table.iloc[:,column].astype(bool) 
print(table.info()) 

但是我相信不應該需要這個需要有人布爾是他們自己的數據類型的每個時間。

相關問題