Pandas:有错误的行的位置

use*_*637 14 pandas

我对Pandas很新,并试图找出我的代码中断的地方.说,我正在进行类型转换:

df['x']=df['x'].astype('int')
Run Code Online (Sandbox Code Playgroud)

...我得到一个错误"ValueError:long()的无效文字,基数为10:'1.0692e + 06'

通常,如果我在数据框中有1000个条目,我如何找出导致中断的条目.ipdb中有什么东西输出当前位置(即代码破坏的地方)?基本上,我试图找出哪些值无法转换为Int.

unu*_*tbu 16

您看到的错误可能是由于列中的值为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'
Run Code Online (Sandbox Code Playgroud)

理想情况下,通过确保DataFrame中存储的值在构建DataFrame时已经是ints而不是字符串,可以避免此问题.如何做到这一点当然取决于您如何构建DataFrame.

事实上,可以使用applymap修复DataFrame:

import ast
df = df.applymap(ast.literal_eval).astype('int')
Run Code Online (Sandbox Code Playgroud)

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


通常,当引发异常以检查有问题的值时,您可以转到调试器row.

但是,在这种情况下,异常发生在调用内部astype,这是一个围绕C编译代码的薄包装器.C编译的代码正在循环遍历值df['x'],因此Python调试器在这里没有帮助 - 它不允许您内省从C编译代码中引发异常的值.

Pandas和NumPy的许多重要部分都是用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))
Run Code Online (Sandbox Code Playgroud)

产量

ERROR at index 0: '1.0692e+06'
Run Code Online (Sandbox Code Playgroud)

  • 是否有更系统的调试模式允许熊猫报告在任何异常中哪些行失败? (2认同)