首页 > 解决方案 > 选择具有布尔值但未被 Pandas 识别为布尔值的列

问题描述

我正在尝试将数据集子集到另一个只有布尔数据字段(真/假)的数据框中。最好的方法是通过 bool dtype 对数据帧进行子集化;但是,我在数据框中有 NA 值,因此 pandas 不会将这些列识别为布尔值。我还尝试对“真”(字符串)值或真值(布尔值)应用过滤器,但无济于事。有什么想法吗?

df = pd.DataFrame({
    'RefID': [1, 2, 3, 4],
    'Lastname': ['Bluejay', 'Westie', 'Tiger', 'Dodo'],
    'Firstname': ['Cantankerous', 'Joy', 'Fifi', 'Mo'],
    'Age': [4, 24, 3, 11],
    'Data': [np.nan, 'False', 'True', 'True'],
    'Graph': [np.nan, 'True', 'False', 'False'],
    'ML': [np.nan, 'False', 'True', 'True']})

所需的输出是:

df1 = pd.DataFrame({'Data': [np.nan, 'False', 'True', 'True'],
    'Graph': [np.nan, 'True', 'False', 'False'],
    'ML': [np.nan, 'False', 'True', 'True']})

标签: pythonpandas

解决方案


这不是因为你有 Na 值(即使有 Na 值,熊猫也可以推断出对象类型),你的问题是因为你有 Strings 而不是 bools

如果你的 df 是这样的:

df = pd.DataFrame({
    'RefID': [1, 2, 3, 4],
    'Lastname': ['Bluejay', 'Westie', 'Tiger', 'Dodo'],
    'Firstname': ['Cantankerous', 'Joy', 'Fifi', 'Mo'],
    'Age': [4, 24, 3, 11],
    'Data': [np.NaN, False, True, True],
    'Graph': [np.NaN, True, False, False],
    'ML': [np.NaN, False, True, True]})

比 pandas 会自动将 "Data" 、 "Graph" 和 "ML" 推断为布尔值:

df.Data == True

0    False
1    False
2     True
3     True
Name: Data, dtype: bool

在创建数据框之前尝试将“真”转换为真

因此,您可以尝试使用此解决方案仅将布尔列从 string 转换为 boolean :

from distutils.util import strtobool

def str_to_bool(x):
    try : 
        return bool(strtobool(x))
    except :
        return x

data = {
    'RefID': [1, 2, 3, 4],
    'Lastname': ['Bluejay', 'Westie', 'Tiger', 'Dodo'],
    'Firstname': ['Cantankerous', 'Joy', 'Fifi', 'Mo'],
    'Age': [4, 24, 3, 11],
    'Data':    [np.NAN,'False', 'True', 'True'],
    'Graph': [np.NAN, 'True', 'False', 'False'],
    'ML': [np.NAN, 'False', 'True', 'True']}

new_data = {k: list(map(lambda x :  str_to_bool(x), v ))  for k, v in data.items() }

df = pd.DataFrame(new_data)

正如您现在看到的那样,数据列是一个布尔值:

df.Data==True

0    False
1    False
2     True
3     True
Name: Data, dtype: bool

推荐阅读