我有一个CSV文件,其格式如下,不同之处在于它大约有2000万行:
A,B,C,D
1,2,3,4
1,1,3,4
1,0,0,1,4,3
1,0,5,6,2,1
我尝试用这样的熊猫来阅读:
df = pd.read_csv(_out_path, sep=',', engine='c') # engine c because it's faster
这会导致以下错误:
ParserError: Error tokenizing data. C error: Expected 18 fields in line 13674206, saw 31
使用上面的测试文件pandas可以处理此问题,并在前两行中添加两个未命名的列,其中包含np.NAN。
A B C D Unnamed: 4 Unnamed: 5
0 1 2 3 4 NaN NaN
1 1 1 3 4 NaN NaN
2 1 0 0 1 4.0 3.0
3 1 0 5 6 2.0 1.0
但是,对于真实文件(不幸的是,我无法共享),它会导致上述错误。
我正在寻找一种解决方法,方法是查找逗号最多的行,计算逗号的Nr,并根据需要在每行中添加尽可能多的逗号,以便熊猫可以读取文件。 还是理想情况下,无论如何还是以更简单的方式读取文件。
编辑:
数据是从数百个CSV文件中串联而成的,但在中间添加了新列(不幸的是,并非所有列都在末尾)。 因此,一个好的解决方案(感谢您的评论)将是在条目的nr发生变化的地方分割文件。
此外,文件中没有标题。在此示例中,我尝试在第一行中手动添加它们,因此我想在拆分文件后必须添加标题。
答案 0 :(得分:2)
为了获得干净的数据集,最好将它们分成单独的文件。
如果列数只会增加而永不减少,则可以使用字典轻松跟踪不同的目标文件:
source_file = open('mixed_data.csv', 'r')
destination_files = {}
for line in source_file:
item_count = len(line.split(','))
try:
dest_file = destination_files[item_count]
except KeyError:
file_name = 'split_data_' + str(item_count) + '.csv'
dest_file = destination_files[item_count] = open(file_name, 'w')
dest_file.write(line)
for dest_file in destination_files.values():
dest_file.close()
source_file.close()
如果程序紧随其后结束或保留了文件对象的绑定范围,则关闭不是严格必要的,但是无论如何都是一种好习惯。