【问题标题】:Select columns that have boolean values but not recognized by Pandas as boolean选择具有布尔值但 Pandas 无法识别为布尔值的列
【发布时间】:2021-12-01 12:01:20
【问题描述】:

我正在尝试将一个数据集子集到另一个只有布尔数据字段(真/假)的数据框中。最好的方法是通过 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']})

【问题讨论】:

  • 你能提供你想要的结果吗?

标签: python pandas


【解决方案1】:

感谢所需的输出和下面的评论,问题更加清晰。下面的 sn-p 可以轻松地为您提供包含“True”-“False”字符串的列名列表。

my_list = []
for col_name in df.columns:
    for record in df[col_name]:
        if record == 'True' or record == 'False':
            my_list.append(col_name)
            break

print(my_list)

【讨论】:

  • 这不是我想要做的——因为我有 700 多个列,我需要 Python 来识别哪些是布尔值,而不必自己去定义列。添加了所需的输出以更清晰..谢谢!
  • 我更新了答案。请注意,break 关键字有助于防止额外的循环。此外,您可以使用 print(df[my_list]) 子集您的数据框
【解决方案2】:

这不是因为你有 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

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

因此,您可以尝试此解决方案,仅将布尔列从字符串转换为布尔值:

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)

你现在可以看到 Data 列是一个布尔值:

df.Data==True

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2021-12-12
    • 1970-01-01
    • 2013-10-26
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多