2024-06-26 15:01:22 发布
网友
我有很多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,并得到以下结果:
pandas需要预先知道几何结构才能构建数据帧。您可以读取标题行并添加几个虚拟列名以提供列数,然后重新读取整个csv并丢弃根本没有使用的列。在
pandas
>>> 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很乐意发出大小不同的行。在
csv
我们可以加载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()预先确定所有行中的最大列数,这将以丢失已知的头名称为代价。在
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也适用于所有其他答案。在
colcount
编辑:注意.csv以外的输入文件(见注释)
pandas
需要预先知道几何结构才能构建数据帧。您可以读取标题行并添加几个虚拟列名以提供列数,然后重新读取整个csv并丢弃根本没有使用的列。在如果有许多额外的列并且您担心中间数据帧的内存占用,可以使用
^{pr2}$csv
模块扫描文件并计算最大行数。与pandas
不同,csv
很乐意发出大小不同的行。在我们可以加载csv然后修复你的问题
如果您事先不知道列数,可以使用
readlines()
预先确定所有行中的最大列数,这将以丢失已知的头名称为代价。在到目前为止,上面的
colcount
也适用于所有其他答案。在编辑:注意.csv以外的输入文件(见注释)
相关问题 更多 >
编程相关推荐