Python 如何将列数据类型从';字符串';至';布尔值';,阿南?
我在数据类型对象的dataframe中有一列,它基本上由许多缺少的值(如NaN)和一些字符串(如“False”和“True”条目)组成。我想将其转换为布尔数据类型,但NaN条目将转换为True。如何保持NaN值不变 1-我尝试了.astype()方法,该方法将NaN值返回为True。 2-尝试先将其转换为数字,然后再转换为布尔值,结果相同 转换前的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 #转换后 在
#
在[]中: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为真或假(第三个选项不是“未知”)
- NaN是float的一个特例
你可以自己尝试一下吗?你可以试试
df[~df.Col1.isnull()].Col1.map(ast.literal\u eval)
,这应该是一个比eval
@anky\u 91ast.literal\u eval
更好的选择-为什么它比eval
更好?嗯,我只是不喜欢:)是原因,但是ast
模块是专门为此设计的,因此应该更安全。链接中没有提到check@anky_91literal_eval
,它只是解释了在许多情况下,您可以不使用eval(比如在我们的情况下,我们可以使用np.where),但我只是阅读了literal_eval的文档“这可以用于安全地评估包含来自不受信任来源的Python值的字符串,而无需自己解析这些值。”,因此可能会更好。谢谢你的评论,我以前不知道ast
模块。@anky_91糟糕,我忽略了它。谢谢。问题是”如何将列数据类型从“string”转换为“boolean”?“,因此我认为原始数据类型是string而不是bool。@Valdi_-Bo感谢您的宝贵贡献。答案的第一部分使用dict映射值可以很好地工作,但是没有任何解决方法可以将列dtype转换为布尔值,并将NaN值保留为缺少的条目,无论是True还是False。可能的重复项