代码之家  ›  专栏  ›  技术社区  ›  Stacey

将列数超过预期的数据读取到数据帧中

  •  0
  • Stacey  · 技术社区  · 6 年前

    我有一些.csv文件,我下载到一个目录。

    每个.csv应该有3列信息。其中一个文件的头部如下所示:

    17/07/2014,637580,10.755
    18/07/2014,61996,10.8497
    21/07/2014,126758,10.8208
    22/07/2014,520926,10.8201
    23/07/2014,370843,9.2883
    

    我用来将.csv读入数据帧(df)的代码是:

    df = pd.read_csv(adj_directory+'\\'+filename, error_bad_lines=False,names=['DATE', 'PX', 'RAW'])
    

    其中我命名了三列(DATE、PX和RAW)。

    当文件格式正确时,这可以正常工作。不过,我注意到有时.csv的格式略有不同,例如:

    09/07/2014,26268315,,
    10/07/2014,6601181,16.3857
    11/07/2014,916651,12.5879
    14/07/2014,213357,,
    15/07/2014,205019,10.8607
    

    缺少列值且值处出现额外逗号的位置。这意味着文件无法加载到数据帧(数据帧) df 数据帧为空)。

    测向 看起来像:

    09/07/2014,26268315,NaN
    10/07/2014,6601181,16.3857
    11/07/2014,916651,12.5879
    14/07/2014,213357,NaN
    15/07/2014,205019,10.8607
    
    2 回复  |  直到 4 年前
        1
  •  0
  •   ALollz    6 年前

    最好是在上游修复文件,这样丢失的值就不会被 , . 但是如果有必要,您可以在python中通过替换 ,, 只是 , (逐行)。把你的坏文件当作 test.csv

    import re
    import csv
    
    patt = re.compile(r",,")
    
    with open('corrected.csv', 'w') as f2:
        with open('test.csv') as f:
            for line in csv.reader(map(lambda s: patt.sub(',', s), f)):
                f2.write(','.join(str(x) for x in line))
                f2.write('\n')
    f2.close()
    f.close()
    

    输出: corrected.csv

    09/07/2014,26268315,
    10/07/2014,6601181,16.3857
    11/07/2014,916651,12.5879
    14/07/2014,213357,
    15/07/2014,205019,10.8607
    

    那么你应该可以毫无疑问地读入这个文件

    import pandas as pd
    
    df = pd.read_csv('corrected.csv', names=['DATE', 'PX', 'RAW'])
    
             DATE        PX      RAW
    0  09/07/2014  26268315      NaN
    1  10/07/2014   6601181  16.3857
    2  11/07/2014    916651  12.5879
    3  14/07/2014    213357      NaN
    4  15/07/2014    205019  10.8607
    
        2
  •  -1
  •   user3661058    6 年前

    昨天有这个问题。

    pd.read_csv(adj_directory+'\\'+filename, 
                error_bad_lines=False,names=['DATE', 'PX', 'RAW'], 
                keep_default_na=False,
                na_values=[''])