如何在异常情况下打印有问题的行

时间:2018-08-19 09:22:43

标签: python pandas

我在代码中使用Pandas,并使用以下代码处理一些数据框:

def exit(exitCode, errorMsg=None, monitor_thread=None):
   if exitCode is not None:
       logger.error(errorMsg)
       logger.error(traceback.format_exc())
   sys.exit(exitCode)

try:
    results['name'] = results['name'].astype(float).astype(int)
except Exception as e:  # catch *all* exceptions
    exit("Failed to convert name" + str(e), 8)

我收到此错误:

  

回溯(最近通话最近一次):

     

文件

中的“ DIST \ FDmanInfo.py”文件,第206行      

文件“ DIST \ FDmanInfo.py”,第191行,位于主文件中

     

文件“ \ local \ Python \ lib \ site-packages \ pandas \ core \ generic.py”,行   3054,同类       raise_on_error = raise_on_error,** kwargs)

     

文件“ \ local \ Python \ lib \ site-packages \ pandas \ core \ internals.py”,   第3189行,为astype

     

返回self.apply('astype',dtype = dtype,** kwargs)

     

文件“ \ local \ Python \ lib \ site-packages \ pandas \ core \ internals.py”,   第3056行,适用       已应用= getattr(b,f)(** kwargs)

     

文件“ \ local \ Python \ lib \ site-packages \ pandas \ core \ internals.py”,   461号线,同型       values = values,** kwargs)

     

文件“ \ local \ Python \ lib \ site-packages \ pandas \ core \ internals.py”,   _astype中的第504行       值= _astype_nansafe(values.ravel(),dtype,copy = True)

     

文件“ \ local \ Python \ lib \ site-packages \ pandas \ types \ cast.py”,行   531,在_astype_nansafe中       引发ValueError('无法将NA转换为整数')ValueError:无法将NA转换为整数

并且我想知道问题所在的行,但是我无法在任何地方找到如何异常打印该行(该行)以进行记录,就像输入数据框是这样:

name
     

0 1.0

     

1 NaN

     

2 3.0

     

3 4.0

我希望它在失败的行上打印,在这种情况下为“ 1 NaN”, 甚至有可能吗?

谢谢

2 个答案:

答案 0 :(得分:6)

您可以使用内置的python库traceback

import traceback
try:
    results['name'] = results['name'].astype(float).astype(int)
except Exception as e:  # catch *all* exceptions
    tb = traceback.format_exc()
    print(tb)
    exit("Failed to convert name" + str(e), 8)

def exit(exitCode, errorMsg=None, monitor_thread=None):
   if exitCode is not None:
       logger.error(errorMsg)
       logger.error(traceback.format_exc())
   sys.exit(exitCode)

更新 检查 traceback 的工作方式的简单示例:

import traceback

try:
    a = [] + None
except Exception as e:
    tb = traceback.format_exc()
    print(tb)
    exit("Failed to convert name" + str(e))


def exit(exitCode):
    print(exitCode)
    print(traceback.format_exc())

答案 1 :(得分:4)

@argo's answer建议您如何修改当前代码。

但是,对于Pandas,您可以简单地列出未转换的值。诀窍是使用pd.to_numeric(而不是pd.Series.astype),它具有其他选项。

例如:

s = pd.to_numeric(results['name'], errors='coerce').astype(int)
failed = results['name'].loc[s.isnull()]