Python 将字符串转换为布尔值只会给出假值

Python 将字符串转换为布尔值只会给出假值,python,pandas,dataframe,Python,Pandas,Dataframe,尝试将数据(csv文件中的字符串格式)转换为布尔值(在数据帧中),我丢失了有关其原始值的信息,因此现在所有值都是布尔值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('tru

尝试将数据(csv文件中的字符串格式)转换为布尔值(在数据帧中),我丢失了有关其原始值的信息,因此现在所有值都是布尔值
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视为真实。为什么我只能得到错误的值?你知道我该怎么修吗

原始数据集和代码示例:

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文件: 转换成小写 将字符串转换为布尔值 然后我测试有多少行的值为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

您可以通过正则表达式和
df对这两个列执行此操作。替换

df.astype(str).replace({'(?i)True|TBC': True, '(?i)False|nan': False}, regex=True)

    Col1   Col2
0   True   True
1   True   True
2  False  False
3  False  False
4  False   True
5   True   True

该模式不区分大小写。

对我来说,这非常有效。由于您没有给出确切的csv格式,我假设它是这样的:

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
         Date  Checked  Verified
0  2018-05-23    False      True
1  2018-05-24     True      True
2  2018-05-26    False      True
3  2018-05-31    False     False
4  2019-12-01     True      True
5  2019-12-05     True      True
6  2019-12-15     True     False
7  2019-12-23    False     False
然后我调用了代码,就像你那样:

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;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
         Date  Checked  Verified
0  2018-05-23    False      True
1  2018-05-24     True      True
2  2018-05-26    False      True
3  2018-05-31    False     False
4  2019-12-01     True      True
5  2019-12-05     True      True
6  2019-12-15     True     False
7  2019-12-23    False     False
您使用哪种python和pandas版本?
我用Python 3.6.1和Pandas 1.04测试了这一点,谢谢cs95。然而,我认为我做错了什么,好像我检查了长度
len(df[df['Col1']==True])
我得到的是
0
,而不是
153
@数学您的数据可能不同,因为这适用于显示的数据。可能您的数据中有前导或尾随空格字符。值仅转换为小写(我更新了问题,但我认为这不会导致问题)。列的名称不同(我有两个名为Checked和Verified的列,但我也认为这不会导致问题)。可能是因为我试图在运行replace命令后从csv?@Math导入字符串。执行此操作:
df['Col1'].value\u counts()
。这应该告诉您列中有多少个真值和假值。这可能与您读取数据的方式有关。你能给出一个导致问题的完整例子吗?我们可以执行的一段代码完全复制了您的操作?您确定在读取数据时使用了正确的分隔符吗?看起来它是以空格分隔的?是的,由于分隔符而出现错误。谢谢你,塞尔诺
         Date  Checked  Verified
0  2018-05-23    False      True
1  2018-05-24     True      True
2  2018-05-26    False      True
3  2018-05-31    False     False
4  2019-12-01     True      True
5  2019-12-05     True      True
6  2019-12-15     True     False
7  2019-12-23    False     False