Pandas:与

2024-05-15 15:43:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我对熊猫很陌生,想知道我的代码在哪里坏了。我正在做一个类型转换:

df['x']=df['x'].astype('int')

…我得到一个错误“ValueError:invalid literal for long(),基数为10:'1.0692e+06'

一般来说,如果数据帧中有1000个条目,我如何才能找出是什么条目导致中断。ipdb中是否有输出当前位置(即代码中断的位置)的内容?基本上,我试图确定哪些值不能转换为Int


Tags: 数据代码dffor错误条目longint
2条回答

您看到的错误可能是由于x列中的值是字符串:

In [15]: df = pd.DataFrame({'x':['1.0692e+06']})
In [16]: df['x'].astype('int')
ValueError: invalid literal for long() with base 10: '1.0692e+06'

理想情况下,可以通过确保存储在 数据帧在构建时已经是int而不是strings。 如何做到这一点当然取决于如何构建数据框架。

事后,可以使用applymap修复数据帧:

import ast
df = df.applymap(ast.literal_eval).astype('int')

但是对数据帧中的每个值调用ast.literal_eval可能会很慢,这就是为什么从一开始就解决问题是最好的选择。


通常您可以drop to a debugger when an exception is raised检查row有问题的值。

然而,在本例中,异常发生在对astype的调用中,该调用是C编译代码的一个薄包装。C编译的代码正在对df['x']中的值进行循环,因此Python调试器在这里没有帮助——它不允许您反省从C编译的代码中引发异常的值。

有很多重要的部分,在C、C++、Cython或FORTRAN中编写,Python调试器不带你进入快速处理循环的非Python代码。

因此,我将返回到一个低级的解决方案:遍历Python循环中的值并使用try...except来捕获第一个错误:

df = pd.DataFrame({'x':['1.0692e+06']})
for i, item in enumerate(df['x']):
   try:
      int(item)
   except ValueError:
      print('ERROR at index {}: {!r}'.format(i, item))

收益率

ERROR at index 0: '1.0692e+06'

要报告由于任何异常而无法映射的所有行,请执行以下操作:

df.apply(my_function)  # throws various exceptions at unknown rows

# print Exceptions, index, and row content
for i, row in enumerate(df):
    try:
        my_function(row)
    except Exception as e: 
        print('Error at index {}: {!r}'.format(i, row))
        print(e)

相关问题 更多 >