2014-10-30 17 views
6

Tôi khá mới đối với Pandas và cố gắng tìm ra nơi mã của tôi bị hỏng. Này, tôi đang làm một kiểu chuyển đổi:Pandas: Vị trí của một hàng có lỗi

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

... và tôi nhận được một lỗi "ValueError: không hợp lệ theo nghĩa đen trong thời gian dài() với cơ sở 10: '1.0692e + 06'

Nói chung, nếu tôi có 1000 mục trong dataframe, làm cách nào tôi có thể tìm ra mục nhập nào gây ra ngắt. Có bất kỳ điều gì trong ipdb xuất ra vị trí hiện tại (tức là nơi mã đã bị hỏng)? Về cơ bản, tôi đang cố gắng xác định giá trị nào không thể chuyển đổi đến số

+0

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

+0

@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

Trả lời

6

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' 
+0

Cảm ơn bạn. Điều đó đã giải quyết được vấn đề của tôi. Tôi cũng đã thử chuyển đổi mọi thứ thành 'phao' và nó hoạt động tốt, ngay cả với chuỗi là giá trị. Một câu hỏi chung chung mặc dù: có cách nào để bước vào lỗi để xác định giá trị (hoặc chỉ số hiện tại) đang phá vỡ? Tnx – user4199637

+0

Tôi đã thêm một gợi ý về cách tìm giá trị có vấn đề (và chỉ mục). – unutbu

+0

có chế độ gỡ lỗi có hệ thống hơn cho phép gấu trúc báo cáo những hàng nào bị lỗi trong bất kỳ ngoại lệ nào không? –

Các vấn đề liên quan