我对Pandas很新,并试图找出我的代码中断的地方。说,我正在进行类型转换:
df['x']=df['x'].astype('int')
...我收到错误" ValueError:long()的基数为10的无效文字:' 1.0692e + 06'
通常,如果我在数据框中有1000个条目,我怎样才能找出导致中断的条目。 ipdb中有什么东西输出当前位置(即代码破坏的地方)?基本上,我试图找出哪些值无法转换为Int。
答案 0 :(得分:13)
您看到的错误可能是由于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'
理想情况下,通过确保存储在中的值可以避免问题 构建DataFrame时,DataFrame已经是ints而不是字符串 。 如何做到这一点当然取决于你如何构建DataFrame。
事实之后,可以使用applymap修复DataFrame:
import ast
df = df.applymap(ast.literal_eval).astype('int')
但是对DataFrame中的每个值调用ast.literal_eval
可能会很慢,这就是从一开始就解决问题的最佳选择。
通常您可以drop to a debugger when an exception is raised检查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))
产量
ERROR at index 0: '1.0692e+06'
答案 1 :(得分:1)
我遇到了同样的问题,因为我有一个很大的输入文件(300万行),所以枚举所有行将花费很长时间。因此,我编写了一个二进制搜索来查找有问题的行。
import pandas as pd
import sys
def binarySearch(df, l, r, func):
while l <= r:
mid = l + (r - l) // 2;
result = func(df, mid, mid+1)
if result:
# Check if we hit exception at mid
return mid, result
result = func(df, l, mid)
if result is None:
# If no exception at left, ignore left half
l = mid + 1
else:
r = mid - 1
# If we reach here, then the element was not present
return -1
def check(df, start, end):
result = None
try:
# In my case, I want to find out which row cause this failure
df.iloc[start:end].uid.astype(int)
except Exception as e:
result = str(e)
return result
df = pd.read_csv(sys.argv[1])
index, result = binarySearch(df, 0, len(df), check)
print("index: {}".format(index))
print(result)
答案 2 :(得分:0)
要报告由于任何异常而无法映射的所有行:
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)