Pandas 熊猫:有错误的行的位置

Pandas 熊猫:有错误的行的位置,pandas,Pandas,我对熊猫很陌生,我想知道我的代码在哪里中断。例如,我正在进行类型转换: df['x']=df['x'].astype('int') …我得到一个错误“ValueError:invalid literal for long(),以10为基数:'1.0692e+06' 一般来说,如果我在数据帧中有1000个条目,我如何找出哪个条目会导致中断。ipdb中是否有任何东西可以输出当前位置(即代码中断的位置)?基本上,我正在尝试确定哪些值无法转换为点。您看到的错误可能是由于这些值造成的在x列中为字符串:

我对熊猫很陌生,我想知道我的代码在哪里中断。例如,我正在进行类型转换:

df['x']=df['x'].astype('int')
…我得到一个错误“ValueError:invalid literal for long(),以10为基数:'1.0692e+06'


一般来说,如果我在数据帧中有1000个条目,我如何找出哪个条目会导致中断。ipdb中是否有任何东西可以输出当前位置(即代码中断的位置)?基本上,我正在尝试确定哪些值无法转换为点。

您看到的错误可能是由于这些值造成的在
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'
理想情况下,可以通过确保存储在 构建数据帧时,数据帧已经是整数而不是字符串。 如何做到这一点当然取决于您如何构建数据帧

事实上,可以使用applymap修复数据帧:

import ast
df = df.applymap(ast.literal_eval).astype('int')
但是对数据帧中的每个值调用
ast.literal\u eval
可能会很慢,这就是为什么从一开始就解决问题是最好的选择


通常,您可以检查
行的有问题的值

但是,在本例中,异常发生在对
astype
的调用中,这是一个围绕C编译代码的薄包装器。C编译代码正在通过
df['x']中的值进行循环
,因此Python调试器在这里没有帮助——它不允许您反省从C编译代码中引发异常的值

有很多重要的部分,在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'

您看到的错误可能是由于
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'
理想情况下,可以通过确保存储在 构建数据帧时,数据帧已经是整数而不是字符串。 如何做到这一点当然取决于您如何构建数据帧

事实上,可以使用applymap修复数据帧:

import ast
df = df.applymap(ast.literal_eval).astype('int')
但是对数据帧中的每个值调用
ast.literal\u eval
可能会很慢,这就是为什么从一开始就解决问题是最好的选择


通常,您可以检查
行的有问题的值

但是,在本例中,异常发生在对
astype
的调用中,这是一个围绕C编译代码的薄包装器。C编译代码正在通过
df['x']中的值进行循环
,因此Python调试器在这里没有帮助——它不允许您反省从C编译代码中引发异常的值

有很多重要的部分,在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'

要报告由于任何异常而无法映射的所有行,请执行以下操作:

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)

要报告由于任何异常而无法映射的所有行,请执行以下操作:

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)

我遇到了同样的问题,因为我有一个大的输入文件(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)
将熊猫作为pd导入
导入系统
def二进制搜索(df、l、r、func):

当我遇到同样的问题时,由于我有一个大的输入文件(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)
将熊猫作为pd导入
导入系统
def二进制搜索(df、l、r、func):

如果在ipython中,您可以打开
pdb
并开始调试:
%pdb
执行命令,然后
%debug
,您将能够遍历堆栈并显示values@EdChum的答案是最好的。您还可以在值上循环,并在try/except中换行。如果在ipython中,您可以打开
pdb
并启动debugging:
%pdb
执行命令,然后
%debug
您将能够遍历堆栈并显示values@EdChum的答案是最好的。您也可以在值上循环,并使用try/except进行包装。谢谢。这解决了我的问题。我还尝试将所有内容转换为“float”,它也可以工作,即使使用字符串也是如此作为一个值。一个一般性的问题是:有没有办法一步一步地找出错误,以确定哪些值(或当前索引)正在破坏?TnxI已经添加了一个关于如何找到问题值(和索引)的建议。是否有一种更系统的调试模式允许pandas报告在任何异常中哪些行失败?@FredericBazin,您可以安排代码。或者,使用IPython,您可以在出现未捕获的异常时使用its启动调试器。进入调试器后,您可以打印当前
@Frede的值ricBazin:但是请注意,只有当行的值可以从发生异常的帧中进行内省时,这才有效。如果您调用的是运行Cython/C/C++/Fortran代码并在行中循环的NumPy或Pandas方法,那么Python调试器将不允许您内省外部代码中变量的状态这就是为什么在上面的代码中,我在Python中对
astype
进行了一个粗略的模拟,这样就可以从Python中找到行的值。谢谢。这解决了我的问题。我还尝试将所有内容转换为“float”,即使字符串作为值,它也能正常工作。不过,这是一个一般性的问题:有没有办法一步一步进入到错误中去指出什么是价值