大熊猫将字符串列转换为布尔值

时间:2019-11-27 06:36:57

标签: python pandas dataframe boolean

我正在尝试将包含字符串格式的True / False和null值的列转换为Boolean。但是无论我做什么,最终我得到的都是True值或False,这都是我使用

的方法

考虑以下dataFrame

df = pd.DataFrame({'w':['True', np.nan, 'False'
                        'True', np.nan, 'False']})
df['w'].dtypes
Out: dtype('O')

df['w'].unique()
Out: array([True, nan, False], dtype=object)

d = {'nan': np.nan,'False':False, 'True': True}
df['w']=df['w'].map(d)

df['w'].dtypes
Out: dtype('O')

df['w'].unique()
array([nan], dtype=object)

我使用的另一种方法是遵循this这样的帖子:

d = {'nan': 0,'False':0, 'True': 1 }
df['w']=df['w'].map(d)
df['w']=df['w'].astype('bool')

现在变为bool,但将所有值都转换为True

df['w'].dtypes
Out: dtype('bool')

df['w'].unique()
Out: array([ True])

我在做什么错? 我希望所有空值都为空

1 个答案:

答案 0 :(得分:2)

我认为没有必要,因为您的原始数据包含带有nan的布尔值,而dtypes是object,因为混合值-缺少值的布尔值:

df = pd.DataFrame({'w':['True', np.nan, 'False']})

print (df['w'].unique())
['True' nan 'False']

print ([type(x) for x in df['w'].unique()])
[<class 'str'>, <class 'float'>, <class 'str'>]

如果nan也为字符串,则您的解决方案有效:

df = pd.DataFrame({'w':['True', 'nan', 'False']})

print ([type(x) for x in df['w'].unique()])
[<class 'str'>, <class 'str'>, <class 'str'>]

d = {'nan': np.nan,'False':False, 'True': True}
df['w'] = df['w'].map(d)

print (df['w'].unique())
[True nan False]

print ([type(x) for x in df['w'].unique()])
[<class 'bool'>, <class 'float'>, <class 'bool'>]

df = pd.DataFrame({'w':[True, np.nan, False]})

print (df['w'].unique())
[True nan False]

print ([type(x) for x in df['w'].unique()])
[<class 'bool'>, <class 'float'>, <class 'bool'>]

如果要将nan替换为False,请使用Series.fillna

df['w'] = df['w'].fillna(False)
print (df)
       w
0   True
1  False
2  False

print (df['w'].dtypes)
bool

print (df['w'].unique())
[ True False]