Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将列数据类型从';字符串';至';布尔值';,阿南?_Python_Pandas_Nan_Python 3.7 - Fatal编程技术网

Python 如何将列数据类型从';字符串';至';布尔值';,阿南?

Python 如何将列数据类型从';字符串';至';布尔值';,阿南?,python,pandas,nan,python-3.7,Python,Pandas,Nan,Python 3.7,我在数据类型对象的dataframe中有一列,它基本上由许多缺少的值(如NaN)和一些字符串(如“False”和“True”条目)组成。我想将其转换为布尔数据类型,但NaN条目将转换为True。如何保持NaN值不变 1-我尝试了.astype()方法,该方法将NaN值返回为True。 2-尝试先将其转换为数字,然后再转换为布尔值,结果相同 转换前的# 在[]中:ri_df.违禁武器.价值计数() Out[]:False 11296 真实的499 名称:违禁武器,数据类型:int64 #转换后 在

我在数据类型对象的dataframe中有一列,它基本上由许多缺少的值(如NaN)和一些字符串(如“False”和“True”条目)组成。我想将其转换为布尔数据类型,但NaN条目将转换为True。如何保持NaN值不变

1-我尝试了.astype()方法,该方法将NaN值返回为True。 2-尝试先将其转换为数字,然后再转换为布尔值,结果相同

转换前的
#
在[]中:ri_df.违禁武器.价值计数()
Out[]:False 11296
真实的499
名称:违禁武器,数据类型:int64
#转换后
在[]中:ri_df.违禁武器.astype('bool').value_counts()
Out[]:True 498385
假11296
名称:违禁武器,数据类型:int64

您可以使用
eval
将字符串
'True'
/
'False'
转换为布尔值
True
/
False
,并保持NAN不变:

df = pd.DataFrame( {'Col1': ['True', np.nan, 'False']})
df.applymap(type)
#              Col1
#0    <class 'str'>
#1  <class 'float'>
#2    <class 'str'>
df.loc[~df.Col1.isnull(),'Col1'] = df[~df.Col1.isnull()].Col1.map(eval)
df.applymap(type)
#              Col1
#0   <class 'bool'>
#1  <class 'float'>
#2   <class 'bool'>
df=pd.DataFrame({'Col1':['True',np.nan',False']})
df.applymap(类型)
#可乐
#0    
#1  
#2    
df.loc[~df.Col1.isnull(),'Col1']=df[~df.Col1.isnull()].Col1.map(eval)
df.applymap(类型)
#可乐
#0   
#1  
#2   
在Stef发表评论后,我完全改变了我的答案:

如果您的列as字符串“真”或“假”与 NaN值,可以使用替换为字典:

  • 将字符串“True”替换为布尔值
  • 将字符串“False”替换为布尔值
比如:

ri_df.contraband_weapon.replace({'True': True, 'False': False}, inplace=True)
所以代码可能很短

但坏消息是,此列的类型仍然是object。 原因是:

  • 大多数值都是布尔类型
  • 但其中一些是NaN,这实际上是float的一个特例
因此,此列中的值之间没有任何“单一”类型, 所以类型不能是bool

编辑以下有关“变通办法”的问题 我知道您希望保留“三值逻辑”(真/假/未知)

如果您想继续使用本机数据类型,我认为没有解决方法,因为:

  • bool为真或假(第三个选项不是“未知”)
  • NaN是float的一个特例
所以你必须接受这种“混合类型”

也许可以选择定义一个分类类型,包括三个 类别,对应于真、假、未知和Translate 每个源值对应于相应的类别

然后将有一个单一的数据类型,但是如果 想要拥有任何“3值布尔运算符/函数”,您必须编程
你可以自己尝试一下吗?

你可以试试
df[~df.Col1.isnull()].Col1.map(ast.literal\u eval)
,这应该是一个比
eval
@anky\u 91
ast.literal\u eval
更好的选择-为什么它比
eval
更好?嗯,我只是不喜欢:)是原因,但是
ast
模块是专门为此设计的,因此应该更安全。链接中没有提到check@anky_91
literal_eval
,它只是解释了在许多情况下,您可以不使用eval(比如在我们的情况下,我们可以使用np.where),但我只是阅读了literal_eval的文档“这可以用于安全地评估包含来自不受信任来源的Python值的字符串,而无需自己解析这些值。”,因此可能会更好。谢谢你的评论,我以前不知道
ast
模块。@anky_91糟糕,我忽略了它。谢谢。问题是”如何将列数据类型从“string”转换为“boolean”?“,因此我认为原始数据类型是string而不是bool。@Valdi_-Bo感谢您的宝贵贡献。答案的第一部分使用dict映射值可以很好地工作,但是没有任何解决方法可以将列dtype转换为布尔值,并将NaN值保留为缺少的条目,无论是True还是False。可能的重复项