将字符串转换为布尔值仅给出 False 值

尝试将数据(来自 csv 文件的字符串格式)转换为布尔值(在数据框中),我“丢失”了有关其原始值的信息,所以现在所有值都是 boolean False。


我试图更改为布尔值的列如下:


df['Col1'] =df['Col1'].astype('bool')

df['Col2'] =df['Col2'].astype('bool')

我也试过


df.Col1 = np.where(df.Col1.eq('true'), True, False)

df. Col2 = np.where(df.Col2.eq('true') | df.Col2.eq('tbc'), True, False)

每列 Col1 和 Col2 的唯一值是:


Col1: array([true, false, nan], dtype=object)


Col2: array(['true', 'false', 'tbc', nan], dtype=object)

我的原始数据集具有以下值。


Col1      Col2

true      true

true      true

false     false

nan       false

false     true

true      tbc

虽然它们被转换为布尔值,但所有值都是 False:


Col1      Col2

False     False

False     False

False     False

False     False

False     False

False     False

我想将 TBC 视为 True。为什么我只得到 False 值?关于如何修复它的任何想法?


原始数据集和代码示例:


Date                 Checked             Verified

2018-05-23           FALSE                TRUE

2018-05-24           TRUE                 TBC

2018-05-26           FALSE                TBC

2018-05-31            nan                 nan

2019-12-01           TRUE                 TRUE

2019-12-05           TRUE                 TBC

2019-12-15           TRUE                 FALSE

2019-12-23           FALSE                nan

代码


读取文件 csv:

df=pd.read_csv(path, sep=';', engine='python')

转换为小写

df= df.apply(lambda x: x.astype(str).str.lower())

将字符串转换为布尔值

df['Checked'] = np.where(df['Checked'].eq('true'), True, False)

df['Verified'] = np.where(df['Verified'].eq('true') | df['Verified'].eq('tbc'), True, False)

然后我测试有多少行具有值 Checked = True:


len(df[df['Checked']=='true']) 

输出:153


转换为布尔值选中:


df['Checked'] = np.where(df['Checked'].eq('true'), True, False)

len(df[df['Checked']==True])

输出:153


转换Verified为布尔值:


df['Verified'] = np.where(df['Verified'].eq('true') | df['Verified'].eq('tbc'), True, False)


len(df[df['Verified']==True])

输出:(0预期60)


慕斯709654
浏览 114回答 2
2回答

潇湘沐

您可以通过正则表达式和对两列执行此操作df.replace:df.astype(str).replace({'(?i)True|TBC': True, '(?i)False|nan': False}, regex=True)    Col1   Col20   True   True1   True   True2  False  False3  False  False4  False   True5   True   True该模式不区分大小写。

慕森卡

对我来说,这非常有效。由于您没有给出确切的 csv 格式,我假设它会是这样的:Date;Checked;Verified2018-05-23;FALSE;TRUE2018-05-24;TRUE;TBC2018-05-26;FALSE;TBC2018-05-31;nan;nan2019-12-01;TRUE;TRUE2019-12-05;TRUE;TBC2019-12-15;TRUE;FALSE2019-12-23;FALSE;nan然后我像你一样调用了代码:df=pd.read_csv(path, sep=';', engine='python')df=df.apply(lambda x: x.astype(str).str.lower())df['Checked'] = np.where(df['Checked'].eq('true'), True, False)df['Verified'] = np.where(df['Verified'].eq('true') | df['Verified'].eq('tbc'), True, False)生成的数据框如下所示:         Date  Checked  Verified0  2018-05-23    False      True1  2018-05-24     True      True2  2018-05-26    False      True3  2018-05-31    False     False4  2019-12-01     True      True5  2019-12-05     True      True6  2019-12-15     True     False7  2019-12-23    False     False您使用哪个 python 和 pandas 版本?我用 Python 3.6.1 和 Pandas 1.04 测试了这个
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python