如何检测数值类型的数组是否只包含布尔值?

时间:2017-04-30 23:10:49

标签: python python-3.x pandas numpy downcast

我正在编写一个用于机器学习的数据预处理器,它需要将布尔数据视为类别,而不是尝试将1视为大于0.使用Pandas DataFrame导入csv表后我想确定哪些列是布尔值并将它们转换为布尔类型,而不迭代所有数字列来执行此操作。 Pandas故意将布尔列解释为'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')
  

根据规则>'safe'

,无法将数组从dtype('int64')转换为dtype('bool')

如果我删除'安全'转换,那么它可以正常工作,但我需要'安全',因为还有非布尔列,否则astype会变成带有数据丢失的布尔值。

如果您可以指出我的错误或建议其他方法将仅使用布尔值的数字列/数组转换为布尔类型,那么很有必要。

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() )

但我相信,每当有人需要布尔值为他们自己的数据类型时,就不应该这样做。