Pandas read_csv add header names以防更改列数

2024-06-26 15:01:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多csv文件,我想与熊猫一起阅读(pd.read_csv文件),但是,在某些文件中,添加了一个没有标题的列,如以下示例:

Apples, Pears
1, 2
3, 4
5, 6, 7

如果使用pd.read_csv文件(示例_文件)引发以下错误“ParserError:error tokenizeing data。C错误:第4行应有2个字段,saw 3

我希望避免跳过行,而只需添加一个伪头名称,如Unknown1,并得到以下结果:

^{pr2}$

Tags: 文件csv标题示例readdata错误error
3条回答

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

如果有许多额外的列并且您担心中间数据帧的内存占用,可以使用csv模块扫描文件并计算最大行数。与pandas不同,csv很乐意发出大小不同的行。在

^{pr2}$

我们可以加载csv然后修复你的问题

import io
t="""Apples, Pears
1, 2
3, 4
5, 6, 7"""
df = pd.read_csv(io.StringIO(t), sep='\t')

yourdf=df.iloc[:,0].str.split(', ',expand=True)
s=df.columns.str.split(', ').tolist()[0]
yourdf.columns=s+['unknow'+str(x+1) for x in range(yourdf.shape[1]-len(s))]


yourdf
Out[104]: 
  Apples Pears unknow1
0      1     2    None
1      3     4    None
2      5     6       7

如果您事先不知道列数,可以使用readlines()预先确定所有行中的最大列数,这将以丢失已知的头名称为代价。在

sep = ','                                                   # Define separator
lines = open("test.csv").readlines()                        # Open file and read lines
colcount = max([len(l.strip().split(sep)) for l in lines])  # Count separator
df = pd.read_csv("test.csv", names = range(colcount), skiprows = [0])
print df

   0  1    2
0  1  2  NaN
1  3  4  NaN
2  5  6  7.0

到目前为止,上面的colcount也适用于所有其他答案。在


编辑:注意.csv以外的输入文件(见注释)

相关问题 更多 >