python - pandas 将任何值转换为 bool(缺失或零)
问题描述
在 python 中,编写类似的东西是没有问题的
if a: ...
即使a
是整数(例如 0)或字符串(例如空字符串),在这种情况下,它也会被强制转换为 false。
然而
dtype_dict = {'type': str, 'exclude_trial':bool}
data = pd.read_csv(filename, sep='\t', dtype=dtype_dict)
返回警告
ValueError: cannot safely convert passed user dtype of bool for object dtyped data in column 26
这是完全不清楚和非常烦人的。
“exclude_trial”列包含值“”(空字符串)或“0”或“1”。当然,它应该只是按照正常行为简单地铸造,否则也是通常的。('','0' -> 假,1->真)
解决方案
读取数据后,您可以.astype(bool)
在 DataFrame 上使用bool(x)
x 是每个单元格中的值的等价物进行转换。
但是,您需要非常小心。pandas
有很多自动 NaN 处理,这意味着空字符串通常会被读入并强制为 NaN,这和while is一样bool('')
是有问题的。即使指定 dtype 也不能防止这种情况,但您可以使用它来确保它不会更改空字符串。False
bool(np.NaN)
True
na_filter
样本数据: test.txt
col1,col2,col3
True,1,
False,0,
True,1,1
df = pd.read_csv('test.txt', na_filter=False)
# col1 col2 col3
#0 True 1
#1 False 0
#2 True 1 1
df = df.astype(bool)
# col1 col2 col3
#0 True True False
#1 False False False
#2 True True True
df.dtypes
#col1 bool
#col2 bool
#col3 bool
推荐阅读
- regex - 具有前瞻模式的 grep 命令不选择任何内容
- html - 文本换行时元素占用 100% 的宽度(flexbox)
- xml - 旧版本产品如何提供方案?
- ruby-on-rails - 如何获得关键字搜索 ransack rails 的最接近匹配
- outlook-addin - 我可以为要使用发送按钮创建的会议设置扩展属性吗?
- regex - 如何从正则表达式模式中只拒绝一个字符串
- perl - 什么是“融合”不同指针指向的位置的好方法?
- android - Android Studio 3.1.3,设计视图总是空的
- windows - Win32 - 确定内存映射文件的脏页
- java - 如何在字符串中使用数字和字母——Java