为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯709654 2022-12-14 21:08:42
尝试将数据(来自 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      Col2true      truetrue      truefalse     falsenan       falsefalse     truetrue      tbc虽然它们被转换为布尔值,但所有值都是 False:Col1      Col2False     FalseFalse     FalseFalse     FalseFalse     FalseFalse     FalseFalse     False我想将 TBC 视为 True。为什么我只得到 False 值?关于如何修复它的任何想法?原始数据集和代码示例: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代码读取文件 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)
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

您可以通过正则表达式和对两列执行此操作df.replace:


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

该模式不区分大小写。


查看完整回答
反对 回复 2022-12-14
?
慕森卡

TA贡献1806条经验 获得超8个赞

对我来说,这非常有效。由于您没有给出确切的 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

然后我像你一样调用了代码:


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

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 测试了这个


查看完整回答
反对 回复 2022-12-14
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号