首页 文章

Python Pandas错误标记数据

提问于
浏览
187

我正在尝试使用pandas来操作.csv文件,但是我收到此错误:

pandas.parser.CParserError:标记数据时出错 . C错误:第3行预计有2个字段,见12

我曾尝试阅读大熊猫文档,但一无所获 .

我的代码很简单:

path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)

我该如何解决这个问题?我应该使用 csv 模块还是其他语言?

档案来自Morningstar

24 回答

  • 1

    我遇到了同样的问题 . 在同一源文件上使用 pd.read_table() 似乎有效 . 我无法追查其原因,但这对我的案例来说是一个有用的解决方法 . 或许知识渊博的人可以更清楚地了解其工作原理 .

    编辑:我发现当您的文件中有一些文本与实际数据格式不同时,此错误会逐渐显现 . 这通常是页眉或页脚信息(大于一行,因此skip_header不起作用),它们不会被与实际数据相同数量的逗号分隔(使用read_csv时) . 使用read_table使用选项卡作为分隔符,可以绕过用户当前错误但引入其他错误 .

    我通常通过将额外数据读入文件然后使用read_csv()方法来解决这个问题 .

    确切的解决方案可能会因您的实际文件而异,但在某些情况下,这种方法对我有用

  • 3

    你也可以尝试;

    data = pd.read_csv('file1.csv', error_bad_lines=False)
    
  • 1

    这可能是一个问题

    • 数据中的分隔符

    • 第一行,正如@TomAugspurger所说

    要解决此问题,请在调用 read_csv 时尝试指定 sep 和/或 header 参数 . 例如,

    df = pandas.read_csv(fileName, sep='delimiter', header=None)
    

    在上面的代码中, sep 定义了分隔符, header=None 告诉pandas您的源数据没有 Headers /列 Headers 的行 . 如此说来the docs:"If file contains no header row, then you should explicitly pass header=None" . 在这种情况下,pandas会自动为每个字段{0,1,2,...}创建整数索引 .

    根据文档,分隔符应该不是问题 . 文档说"if sep is None [not specified], will try to automatically determine this."但是我没有好运,包括具有明显分隔符的实例 .

  • 1

    解析器被文件的 Headers 弄糊涂了 . 它读取第一行并推断该行的列数 . 但前两行不代表文件中的实际数据 .

    试试 data = pd.read_csv(path, skiprows=2)

  • 28

    您的CSV文件可能具有可变数量的列,并且 read_csv 推断出前几行中的列数 . 在这种情况下解决它的两种方法:

    1)将CSV文件更改为具有最大列数的虚拟第一行(并指定 header=[0]

    2)或使用 names = list(range(0,N)) ,其中N是最大列数 .

  • 281

    我也有这个问题,但也许是出于其他原因 . 我的CSV中有一些尾随逗号,它们添加了一个pandas试图阅读的附加列 . 使用以下工作,但它只是忽略坏线:

    data = pd.read_csv('file1.csv', error_bad_lines=False)
    

    如果你想保持线条是一种丑陋的黑客来处理错误,那就是做如下的事情:

    line     = []
    expected = []
    saw      = []     
    cont     = True 
    
    while cont == True:     
        try:
            data = pd.read_csv('file1.csv',skiprows=line)
            cont = False
        except Exception as e:    
            errortype = e.message.split('.')[0].strip()                                
            if errortype == 'Error tokenizing data':                        
               cerror      = e.message.split(':')[1].strip().replace(',','')
               nums        = [n for n in cerror.split(' ') if str.isdigit(n)]
               expected.append(int(nums[0]))
               saw.append(int(nums[2]))
               line.append(int(nums[1])-1)
             else:
               cerror      = 'Unknown'
               print 'Unknown Error - 222'
    
    if line != []:
        # Handle the errors however you want
    

    我继续编写一个脚本来将行重新插入到DataFrame中,因为坏行将由上面代码中的变量“line”给出 . 只需使用csv阅读器即可避免这一切 . 希望大熊猫开发人员能够在将来更轻松地处理这种情况 .

  • 1

    这绝对是分隔符的问题,因为大多数csv CSV都是使用 sep='/t' 创建的,所以尝试使用制表符 (\t) 使用分隔符 /t read_csv . 所以,尝试使用以下代码行打开 .

    data=pd.read_csv("File_path", sep='\t')
    
  • 0

    我自己有几次这个问题 . 几乎每次,原因是我试图打开的文件不是一个正确保存的CSV开头 . 并且通过“正确”,我的意思是每行具有相同数量的分隔符或列 .

    通常它发生是因为我在Excel中打开了CSV然后不正确地保存了它 . 即使文件扩展名仍为.csv,纯CSV格式也已更改 .

    使用pandas to_csv保存的任何文件都将正确格式化,不应该出现此问题 . 但是如果你用另一个程序打开它,它可能会改变结构 .

    希望有所帮助 .

  • 0

    在尝试使用空格,逗号和引号读取制表符分隔的表时,我遇到了类似的问题:

    1115794 4218    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
    1144102 3180    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
    368444  2328    "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""
    
    
    
    import pandas as pd
    # Same error for read_table
    counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')
    
    pandas.io.common.CParserError: Error tokenizing data. C error: out of memory
    

    这说明它与C解析引擎有关(这是默认的) . 也许改成蟒蛇会改变任何东西

    counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')
    
    Segmentation fault (core dumped)
    

    现在这是一个不同的错误 .
    如果我们继续尝试从表中删除空格,python-engine的错误将再次更改:

    1115794 4218    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
    1144102 3180    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
    368444  2328    "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""
    
    
    _csv.Error: '   ' expected after '"'
    

    很明显,大熊猫在解析我们的行时遇到了问题 . 要使用python引擎解析表,我需要事先从表中删除所有空格和引号 . 与此同时,C-engine即使用逗号连续排列也不停地崩溃 .

    为了避免使用替换创建新文件,我这样做了,因为我的表很小:

    from io import StringIO
    with open(path_counts) as f:
        input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
        counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')
    

    tl;dr
    更改解析引擎,尽量避免任何非分隔数据中的引号/逗号/空格 .

  • 19

    虽然不是这个问题的情况,但压缩数据也可能出现此错误 . 明确设置 kwarg compression 的值解决了我的问题 .

    result = pandas.read_csv(data_source, compression='gzip')
    
  • 7

    以下命令序列工作(我丢失数据的第一行-no header = None present-,但至少它加载):

    df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

    以下不起作用:

    df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))

    CParserError:标记数据时出错 . C错误:预计行1605634中的53个字段,看到54以下不起作用:

    df = pd.read_csv(filename, header=None)

    CParserError:标记数据时出错 . C错误:预计行1605634中的53个字段,见54

    因此,在您的问题中,您必须通过 usecols=range(0, 2)

  • 12

    有时候问题不是如何使用python,而是使用原始数据 .
    我收到此错误消息

    Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.
    

    事实证明,在列描述中有时候会有逗号 . 这意味着需要清理CSV文件或使用其他分隔符 .

  • -2

    使用 pandas.read_csv('CSVFILENAME',header=None,sep=', ')

    当试图从链接读取csv数据时

    http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data

    我将网站上的数据复制到我的csvfile中 . 它有额外的空间所以使用sep =','它工作:)

  • 2

    我发现在处理类似的解析错误时有用的替代方法是使用CSV模块将数据重新路由到pandas df中 . 例如:

    import csv
    import pandas as pd
    path = 'C:/FileLocation/'
    file = 'filename.csv'
    f = open(path+file,'rt')
    reader = csv.reader(f)
    
    #once contents are available, I then put them in a list
    csv_list = []
    for l in reader:
        csv_list.append(l)
    f.close()
    #now pandas has no problem getting into a df
    df = pd.DataFrame(csv_list)
    

    我发现CSV模块对格式不佳的逗号分隔文件更加健壮,因此这条路线成功解决了这些问题 .

  • 1

    我有一个包含现有行号的数据集,我使用了index_col:

    pd.read_csv('train.csv', index_col=0)
    
  • 4

    这就是我所做的 .

    sep='::' 解决了我的问题:

    data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')
    
  • 14

    我有类似的情况和设置

    train = pd.read_csv('input.csv' , encoding='latin1',engine='python')
    

    工作

  • 3

    在参数中使用分隔符

    pd.read_csv(filename, delimiter=",", encoding='utf-8')
    

    它会读 .

  • 8

    read_csv时遇到同样的问题:ParserError:错误标记数据 . 我刚刚将旧的csv文件保存到新的csv文件中 . 问题已经解决了!

  • -1

    我有一个类似的错误,问题是我的csv文件中有一些转义引号,需要适当设置escapechar参数 .

  • 2

    您可以执行此步骤以避免此问题 -

    train = pd.read_csv('/home/Project/output.csv' , header=None)
    

    只需添加 - header=None

    希望这可以帮助!!

  • 47

    问题可能是文件问题,在我的情况下,问题在重命名文件后得到解决 . 还没弄清楚原因..

  • 2

    我收到了一位同事的.csv,当我尝试使用pd.read_csv()读取csv时,我收到了类似的错误 . 它显然试图使用第一行为数据帧生成列,但是有许多行包含的列比第一行所暗示的要多 . 我最后通过打开并将文件重新保存为.csv并再次使用pd.read_csv()来解决此问题 .

  • 0

    试试: pandas.read_csv(path, sep = ',' ,header=None)

相关问题