Lỗi bạn đang thấy có thể là do (các) giá trị trong cột x
là chuỗi:
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'
Một cách lý tưởng, vấn đề có thể tránh được bằng cách đảm bảo các giá trị được lưu trữ trong DataFrame đã không ints chuỗi khi DataFrame được xây dựng. Cách thực hiện điều đó tùy thuộc vào cách bạn đang xây dựng DataFrame.
Sau khi thực tế, DataFrame có thể được cố định bằng applymap:
import ast
df = df.applymap(ast.literal_eval).astype('int')
nhưng gọi ast.literal_eval
trên mỗi giá trị trong DataFrame có thể là chậm, đó là lý do sửa chữa các vấn đề ngay từ đầu là lựa chọn tốt nhất.
Thông thường bạn có thể drop to a debugger when an exception is raised để kiểm tra giá trị có vấn đề của row
.
Tuy nhiên, trong trường hợp này ngoại lệ xảy ra bên trong cuộc gọi đến astype
, đây là một trình bao bọc mỏng xung quanh mã được biên dịch C. Mã C-biên dịch đang làm vòng lặp thông qua các giá trị trong df['x']
, do đó trình gỡ lỗi Python không hữu ích ở đây - nó sẽ không cho phép bạn nhìn vào giá trị ngoại lệ được nâng lên từ bên trong mã được biên dịch C.
Có rất nhiều phần quan trọng của Pandas và NumPy được viết bằng C, C++, Cython hoặc Fortran và trình gỡ lỗi Python sẽ không đưa bạn vào bên trong những đoạn mã không phải Python mà các vòng lặp nhanh được xử lý.
Vì vậy, thay vào đó tôi sẽ trở lại với một giải pháp trán thấp: lặp qua các giá trị trong một vòng lặp Python và sử dụng try...except
để bắt lỗi đầu tiên:
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))
mang
ERROR at index 0: '1.0692e+06'
Nếu trong ipython bạn có thể bật 'pdb' và bắt đầu gỡ lỗi:'% pdb' thực hiện lệnh và sau đó '% debug', bạn sẽ có thể đi bộ ngăn xếp và hiển thị các câu trả lời của giá trị – EdChum
@EdChum là tốt nhất. Bạn cũng có thể lặp lại các giá trị và bọc trong thử/ngoại trừ. – exp1orer