Pandas read_csv在更改列数时添加标题名称

Ada*_*sen 7 python pandas

我有很多csv文件,我想用Pandas(pd.read_csv)阅读,但是,在一些文件中添加了一个没有标题的中间列,如下例所示:

Apples, Pears
1, 2
3, 4
5, 6, 7
Run Code Online (Sandbox Code Playgroud)

如果使用pd.read_csv(example_file),则抛出以下错误" ParserError:错误标记数据.C错误:第4行中预期2个字段,看到3 "

我想避免跳过该行,而只是添加一个虚拟头名称,如Unknown1,并得到以下结果:

Apples, Pears, Unknown1  
1, 2, np.nan
3, 4, np.nan
5, 6, 7
Run Code Online (Sandbox Code Playgroud)

tde*_*ney 5

pandas需要预先了解几何以构建数据框。您可以阅读标题行并添加几个虚拟列名称以提供列数,然后重新读取整个csv并丢弃毕竟不使用的列。

>>> import pandas as pd
>>> names = list(pd.read_csv('foo.csv', nrows=0)) + ['unknown1', 'unknown2']
>>> df=pd.read_csv('foo.csv', names=names, skiprows=1).dropna(axis='columns', how='all')
>>> df
   Apples   Pears  unknown1
0       1       2       NaN
1       3       4       NaN
2       5       6       7.0
Run Code Online (Sandbox Code Playgroud)

如果有很多额外的列,并且您担心中间数据帧的内存占用,则可以使用该csv模块扫描文件并计算最大行数。不像pandascsv很高兴发出大小可变的行。

>>> with open('foo.csv', newline='') as in_fp:
...     reader = csv.reader(in_fp)
...     header = next(reader)
...     num_cols = max(len(row) for row in reader)
... 
>>> names = header + ['unknown{}'.format(i+1) for i in range(num_cols-len(header))]
>>> df = pd.read_csv('foo.csv', names=names, skiprows=1)
>>> df
   Apples   Pears  unknown1
0       1       2       NaN
1       3       4       NaN
2       5       6       7.0
Run Code Online (Sandbox Code Playgroud)