ValueError: The truth value of a DataFrame is ambiguous. Use a.empty 解决办法。(附 if 深层理解)
由于python语言的简洁性,在判断一个容器是否为空的时候,比如列表,可以直接用if + 要判断的东西:
a = list()
if a:print('不为空')
else:print('列表为空')
如果是空会返回false,在有值的时候会返回true。
这是因为列表加在 if 后面构成判断语句时,python是能判断要做什么,针对空列表,以及列表本身为none都hi返回false。
而如果是dataframe的话,就会报错了:
def get_df(df=None):res = df if df else pd.DataFrame() print(res)get_df(df)
看到这个报错有点蒙,分析下,我这里是把df作为一个参数传进来,而我想要的逻辑是如果df传入就采用传入的值,没有传的话就新建(这里只是为了说明问题)。但是这样写会报错,从报错信息来看,也就是python认为它不清楚我想要让它判断什么,它不清楚什么是我想要的真,什么是假。
根据它的提示,如果我要判断这个数据框是否是一个空的数据框,我应该用empty,判断布尔值,应该用bool。。。等等。所以这里应该明确告诉python我的意图,我只是想知道有没有这个参数。所以进行以下改造:
def get_df(df=None):res = df if df is not None else pd.DataFrame()print(res)get_df(df)
明确指定要判断的事情就可以了。从这里我也发现,数据框和传统的容器是有一些不同的,套用传统的操作时,还是要多加注意。
后续研究结果:
python的if是在调用内置方法 __bool__(),并且优先使用它,如果没有布尔方法则去找 __len__()方法。
举个例子:
自定义一个类,定义__bool__方法和__len__方法。
实例化该类,并直接进行 if 判断该实例,它调用的实际是bool方法,结果为bool方法的返回值,false。
注释掉 bool 方法,可以看到它调用的是 len 方法,len 返回为1,只有0 为false,其他都是true,所以返回true。
由此可以得知,如果想让 if 逻辑判断自己定义的逻辑,需要定义bool方法,某种情况下 len也可以。
上述报错是因为dataframe继承自ndframe,而ndframe重写了__bool__()方法,将其指向为自定义方法:
__nonzero__()。
__bool__ = __nonzero__
在这个自定义方法里,什么都没有做,只是抛了一个异常:
def __nonzero__(self):raise ValueError("The truth value of a {0} is ambiguous. ""Use a.empty, a.bool(), a.item(), a.any() or a.all().".format(self.__class__.__name__))
目的,应该是为了避免直接使用 if df的写法。
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty 解决办法。(附 if 深层理解)相关推荐
- 成功解决ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any(
成功解决ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any( ...
- ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a. ...
- 成功解决ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() o
成功解决ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() o ...
- 【python】The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all
在pandas用Dataframe中的某个值进行if逻辑判断时,进行以下代码书写: if max_data.user_id != 'ALL':print(max_data['user_id']) Va ...
- ValueError: invalid literal for int() with base 10:Python报错及其解决办法
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 报错情况 Valu ...
- 将npz文件转化为txt文件中出现错误(ValueError: Expected 1D or 2D array, got 3D array instead)的解决办法
seq.npz直接使用Notepad++打开发生错误,试着使用python去读这个文件包. import numpy as np# %% seq_data = np.load('seq.npz') p ...
- Python解决The truth value of a Series is ambiguous.md
Python解决The truth value of a Series is ambiguous.md import pandas as pd data = pd.read_csv('x.csv') ...
- 成功解决ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
成功解决ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or ...
- python报错:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any(
在判断多元素数组是否为空时,报了这个错 if a: # a是含有多个元素的numpy数组xxx python报错: ValueError: The truth value of an array wi ...
最新文章
- 芝麻翻译软件测试,细数35个单元测试准则 “Hello, world!”
- 2019ICCV论文 Non-Local ConvLSTM for Video Compression Artifact Reductio
- 图解用NetCat连接远程端口
- 笔记本电脑性价比排行2019_办公笔记本电脑排名2019 五款适合办公的笔记本电脑推荐...
- php实现下单成功提示语,推荐10款提示语源码(收藏)汇总
- Apache与Nginx实现Web页面动静分离(产生的原因,应用场景)
- ruby 嵌套函数_Ruby嵌套有示例的循环
- JAVA 最新 环境搭建(JDK 1.8 + Tomcat 9 + eclipse oxygen + mysql 5.7)
- JAVA画SVG图(Batik框架)SVGComponentDemo
- configure: error: udev support requested but libudev header not installed
- 七月算法机器学习4 凸优化初步
- React 中setState更新state何时同步何时异步?
- U盘、移动硬盘不格式化制作启动盘
- 计算机科学的方法论有三个过程,计算机科学与技方法论3.ppt
- AI发票扫描识别sdk软件接口
- Ubuntu Tty (字符终端) 显示中文,和字体大小设置
- 在前端layui项目中使用ztree
- 托管网站需要知道的网站优化指标有哪些
- 第十一届蓝桥杯第三场软件类省赛 C++ B组 题解
- 冈萨雷斯《数字图像处理》学习笔记(八)图像压缩