我在代码中使用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”, 甚至有可能吗?
谢谢
答案 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()]