28

我有一个 csv 文件,它有几百行和 26 列,但最后几列只有几行中的值,它们位于文件的中间或末尾。当我尝试使用 read_csv() 读取它时,出现以下错误。“ValueError:预期 23 列,在第 64 行得到 26”

我看不到在哪里明确说明文件中的列数,或者它如何确定它认为文件应该有多少列。转储在下面

In [3]:

infile =open(easygui.fileopenbox(),"r")
pledge = read_csv(infile,parse_dates='true')


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-b35e7a16b389> in <module>()
      1 infile =open(easygui.fileopenbox(),"r")
      2 
----> 3 pledge = read_csv(infile,parse_dates='true')


C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in read_csv(filepath_or_buffer, sep, dialect, header, index_col, names, skiprows, na_values, thousands, comment, parse_dates, keep_date_col, dayfirst, date_parser, nrows, iterator, chunksize, skip_footer, converters, verbose, delimiter, encoding, squeeze)
    234         kwds['delimiter'] = sep
    235 
--> 236     return _read(TextParser, filepath_or_buffer, kwds)
    237 
    238 @Appender(_read_table_doc)

C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in _read(cls, filepath_or_buffer, kwds)
    189         return parser
    190 
--> 191     return parser.get_chunk()
    192 
    193 @Appender(_read_csv_doc)

C:\Python27\lib\site-packages\pandas-0.8.1-py2.7-win32.egg\pandas\io\parsers.pyc in get_chunk(self, rows)
    779             msg = ('Expecting %d columns, got %d in row %d' %
    780                    (col_len, zip_len, row_num))
--> 781             raise ValueError(msg)
    782 
    783         data = dict((k, v) for k, v in izip(self.columns, zipped_content))

ValueError: Expecting 23 columns, got 26 in row 64
4

4 回答 4

35

您可以使用names参数。例如,如果您有这样的 csv 文件:

1,2,1
2,3,4,2,3
1,2,3,3
1,2,3,4,5,6

并尝试阅读它,你会收到错误

>>> pd.read_csv(r'D:/Temp/tt.csv')
Traceback (most recent call last):
...
Expected 5 fields in line 4, saw 6

但是如果你传递names参数,你会得到结果:

>>> pd.read_csv(r'D:/Temp/tt.csv', names=list('abcdef'))
   a  b  c   d   e   f
0  1  2  1 NaN NaN NaN
1  2  3  4   2   3 NaN
2  1  2  3   3 NaN NaN
3  1  2  3   4   5   6

希望能帮助到你。

于 2013-11-22T21:02:28.957 回答
7

您还可以使用分隔符“^”加载 CSV,将整个字符串加载到一列,然后使用 split 将字符串分成所需的分隔符。之后,您执行 concat 以与原始数据框合并(如果需要)。

temp=pd.read_csv('test.csv',sep='^',header=None,prefix='X')
temp2=temp.X0.str.split(',',expand=True)
del temp['X0']
temp=pd.concat([temp,temp2],axis=1)
于 2015-08-24T22:10:09.350 回答
2

假设你有一个这样的文件:

a,b,c
1,2,3
1,2,3,4

你可以csv.reader先清理文件,

lines=list(csv.reader(open('file.csv')))    
header, values = lines[0], lines[1:]    
data = {h:v for h,v in zip (header, zip(*values))}

并得到:

{'a' : ('1','1'), 'b': ('2','2'), 'c': ('3', '3')}

如果你没有标题,你可以使用:

data = {h:v for h,v in zip (str(xrange(number_of_columns)), zip(*values))}

然后你可以将字典转换为数据框

import pandas as pd
df = pd.DataFrame.from_dict(data)
于 2013-11-22T21:13:48.260 回答
1

给定解决方案的问题是您必须知道所需的最大列数。我找不到解决这个问题的直接函数,但你肯定可以写一个 def 可以:

  1. 阅读所有行
  2. 拆分它
  3. 计算每行中的单词/元素数
  4. 存储单词/元素的最大数量
  5. 将最大值放在名称选项中(如Roman Pekar所建议)

这是我为文件编写的 def(函数):

def ragged_csv(filename):
    f=open(filename)
    max_n=0
    for line in f.readlines():
        words = len(line.split(' '))
        if words > max_n:
            max_n=words
    lines=pd.read_csv(filename,sep=' ',names=range(max_n))
    return lines
于 2017-01-19T05:59:56.680 回答