处理熊猫中的非结构化数据

时间:2018-07-26 05:46:01

标签: python-3.x pandas

我正在尝试使用熊猫read_csv()读取非结构化的csv文件。问题是某些文件的行中带有多余的列,如示例输入中所示。

样本输入:

col0,col1,col2
a,b,c
a,b,c,d
a,b,c 
a,b,c,d

在处理此类文件时,程序会抛出一些ParseError

ParserError: Error tokenizing data. C error: Expected 3 fields in line 3, saw 4

示例输出:

col0 | col1 | col2 | col3
a    | b    | c    | NaN
a    | b    | c    | d
a    | b    | c    | NaN
a    | b    | c    | d

我不想忽略熊猫error_bad_lines = False中带有read_csv()参数的行。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

一个可能的解决方案是先进行预处理并找到最大数量的分隔符,然后通过names设置参数range

path_csv = 'file.csv'
with open(path_csv) as f:
    lines = f.readlines()
    num = max(l.count(',') for l in lines) + 1
    print (num)
    4

df = pd.read_csv(path_csv, names=range(num))
print (df)
      0     1     2    3
0  col0  col1  col2  NaN
1     a     b     c  NaN
2     a     b     c    d
3     a     b    c   NaN
4     a     b     c    d

如果标头不重要,则可以将其删除:

df = pd.read_csv(path_csv, names=range(num), skiprows=1)
print (df)
   0  1   2    3
0  a  b   c  NaN
1  a  b   c    d
2  a  b  c   NaN
3  a  b   c    d

另一个更动态的解决方案是将值添加到标头:

path_csv = 'file.csv'
with open(path_csv) as f:
    lines = f.readlines()
    #get header to list
    header = [x.strip() for x in lines[0].split(',')]
    #get max number of separator
    max_num = max(l.count(',') for l in lines)
    #add missing header values by range
    if len(header) < max_num + 1:
        header = header + list(range(max_num-len(header) + 1))
    print (header)
['col0', 'col1', 'col2', 0]

df = pd.read_csv(path_csv, names=header, skiprows=1)
print (df)
  col0 col1 col2    0
0    a    b    c  NaN
1    a    b    c    d
2    a    b   c   NaN
3    a    b    c    d