Pandas:有错误的行的位置

时间:2014-10-30 18:09:53

标签: pandas

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

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

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

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

3 个答案:

答案 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)