【问题标题】:pandas convert strings column to boolean熊猫将字符串列转换为布尔值
【发布时间】:2020-03-22 15:58:30
【问题描述】:

我正在尝试将包含字符串格式的 True/False 和 null 值的列转换为布尔值。但无论我做什么,我最终都会得到所有 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 SO 帖子:

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])

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

【问题讨论】:

  • 你能分享所有相关的代码和数据吗?请参阅:minimal reproducible example。
  • @AlexanderCécile 我还能分享什么我已经添加了代码来生成我的数据框
  • 第一种方法(地图)在我看来是正确的,不是吗?它有什么问题?
  • @AlexanderCécile 效果很好,我对 nan 加入他们感到有些困惑,这导致 dtypes 成为对象,@jezrael ans/explanation 帮助解决了这个问题

标签: python pandas dataframe boolean


【解决方案1】:

我认为没有必要,因为您的原始数据包含带有 nans 的布尔值,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]

【讨论】:

  • 如果我想让 nan 也为假,那么流程应该是什么?
  • 然后使用df['w'] = df['w'].fillna(False)
猜你喜欢
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2021-09-19
  • 2012-03-10
  • 2012-12-16
  • 1970-01-01
相关资源
最近更新 更多