例外情况不存在';不要对DataFrame python破例
我试图从excel文件加载一些数据,并检查一些值是否为整数。但是,我不成功,例外情况不存在';不要对DataFrame python破例,python,pandas,exception,Python,Pandas,Exception,我试图从excel文件加载一些数据,并检查一些值是否为整数。但是,我不成功,IsInt方法不会触发任何异常。为什么? 在Excel文件中,整数也可以保存为5.00 class Load; def __init__(self, path="data.xls"): self.data = pd.read_excel(path, header=1, sheetname=0) self.diction = self.data.to_dict(orient='ind
IsInt
方法不会触发任何异常。为什么?
在Excel文件中,整数也可以保存为5.00
class Load;
def __init__(self, path="data.xls"):
self.data = pd.read_excel(path, header=1, sheetname=0)
self.diction = self.data.to_dict(orient='index')
def IsInt(self, i, j):
try:
num = int(self.data.iat[i,j])
except ValueError:
print('error')
load = Load()
load.IsInt(0, 0)
您可以尝试以下方法:
class Load;
def __init__(self, path="data.xls"):
self.data = pd.read_excel(path, header=1, sheetname=0)
self.diction = self.data.to_dict(orient='index')
def IsInt(self, i, j):
if isinstance(self.data.iat[i,j], int)
num=self.data.iat[i,j]
else:
print('error')
由于num
未在IsInt的内部或外部使用,因此您可以使用更干净的IsInt
def IsInt(self, i, j):
if not isinstance(self.data.iat[i, j], int):
print('error')
在Python中,num=int(1.6)
不会导致错误。它只是通过截断小数部分将num
设置为1
要检查数字是否真的是整数,请执行类似于if x==int(x):…
的操作。如果x
根本不是一个数字,您仍然应该捕获TypeError
以下是您可以应用此功能的方法:
def IsInt(self, i, j):
try:
num=self.data.iat[i, j]
if num != int(num):
raise ValueError()
except TypeError, ValueError:
print('error')
这将打印字符串单元格和浮点值为3.14的单元格的错误。它将允许具有实际整数的单元格和包含不含小数部分的浮点的单元格,如5.0
逐步细分:
int(num)
将通过引发TypeError
来删除任何非字符串或数字的类型。它还将删除不表示带有ValueError
的整数的字符串
num!=int(num)
消除任何包含小数部分的整数字符串和数字类型。为了触发与#1中相同的响应,我们制作了自己的ValueError
剩下的唯一不会触发错误的类型是数字类型(int
、float
、分数
,等等),它们没有小数部分
为什么不使用isinstance(self.data.iat[i,j],int)
?如果self.data.iat[i,j]
是一个双精度(例如,3.14),它将不会引发异常,num将是3。@ArthurGouveia,它没有帮助,它仍然在第一个分支中,因此不会打印错误。澄清一下:我有一个excel文件,其中一些poitions应该是整数(一些实体的数量),如果输入不正确,我想写一条错误消息。任何浮点都可以转换为int而不会触发错误是的,我非常努力地用try/except来做,但这是可以接受的。谢谢但是,我稍微修改了它,因此整数输入的形式可以是5.000(例如)如果不是(self.data.iat[I,j]%1==0.0):
这不会传递整数浮点。@Arthur。我使用的事实是,我已经有了一个try-catch块来避免代码重复。这是一个相当普遍的现象algorithm@ArthurGouveia. 在这种情况下使用duck类型也更好,因为您确实无法确定前面的num
类型是什么。它可以是str
,date
,float
,int
,等等。我的方法会自动过滤掉任何行为与数字不同的内容。