例外情况不存在';不要对DataFrame python破例

例外情况不存在';不要对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

我试图从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='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
    ,等等。我的方法会自动过滤掉任何行为与数字不同的内容。