我对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_eval
DataFrame中的每个值可能会很慢,这就是为什么从一开始就解决问题是最好的选择.
通常,当引发异常以检查有问题的值时,您可以转到调试器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)
归档时间: |
|
查看次数: |
5174 次 |
最近记录: |