我正在读取一个包含8列Pandas数据帧的CSV文件。最后一列包含一条错误消息,其中一些包含逗号。这会导致文件读取失败并显示错误ParserError: Error tokenizing data. C error: Expected 8 fields in line 21922, saw 9
有没有办法在第8个字段后忽略所有逗号,而不是必须浏览文件并删除多余的逗号?
读取文件的代码:
import pandas as pd
df = pd.read_csv('C:\\somepath\\output.csv')
行有效:
061AE,Active,001,2017_02_24 15_18_01,00006,1,00013,some message
失败的行:
061AE,Active,001,2017_02_24 15_18_01,00006,1,00013,longer message, with commas
答案 0 :(得分:6)
您可以使用import pandas as pd
from io import StringIO
import re
for_pd = StringIO()
with open('MikeS159.csv') as mike:
for line in mike:
new_line = re.sub(r',', '|', line.rstrip(), count=7)
print (new_line, file=for_pd)
for_pd.seek(0)
df = pd.read_csv(for_pd, sep='|', header=None)
print (df)
将前几个逗号替换为' |',将中间结果保存在 0 1 2 3 4 5 6 \
0 061AE Active 1 2017_02_24 15_18_01 6 1 13
1 061AE Active 1 2017_02_24 15_18_01 6 1 13
7
0 some message
1 longer message, with commas
然后处理。
Application.Goto Worksheets(2).Range("A101"), True
With ActiveWindow
.SplitColumn = 0
.SplitRow = 10
.FreezePanes = True
End With
我将问题中的两行放入文件中以获得此输出。
jQuery('.mean-nav ul').hide();
答案 1 :(得分:3)
您可以使用read_csv函数中的参数usecols来限制您读入的列。例如:
import pandas as pd
pd.read_csv(path, usecols=range(8))
如果您只想阅读前8列。
答案 2 :(得分:3)
您可以在Pandas issues page上张贴的这个环形交叉路口拍摄:
import csv
import pandas as pd
import numpy as np
df = pd.read_csv('filename.csv', parse_dates=True, dtype=Object, delimiter="\t", quoting=csv.QUOTE_NONE, encoding='utf-8')
您还可以对数据进行预处理,基本上将所有前7个(第0个到第6个,包括首字母)逗号分别更改为分号,然后将之后的内容更改为逗号*,使用类似的内容:
to_write = []
counter = 0
with open("sampleCSV.csv", "r") as f:
for line in f:
while counter < 7:
line = list(line)
line[line.index(",")] = ";"
counter += 1
counter = 0
to_write.append("".join(line))
您现在可以将此to_write
列表视为像
data = pd.DataFrame(to_write)
data = pd.DataFrame(data[0].str.split(";").values.tolist()),
或将其写回csv并使用带有分号分隔符的pandas进行读取,例如read_csv(csv_path, sep=';')
。
我在没有经过严格测试的情况下快速起草了这个,但是应该给你一些尝试的想法。请评论是否有帮助,我会对其进行编辑。
*另一个选项是在7日之后删除所有逗号,并继续使用逗号分隔符。无论哪种方式,要点是将前7个分隔符与后续标点符号区分开来。
答案 3 :(得分:0)
加入@Tblaz答案如果您使用 GoogleColab ,则可以使用此解决方案,在我的情况下,第24列是多余的逗号,所以我只需要阅读23列:
import pandas as pd
from google.colab import files
import io
uploaded = files.upload()
x_train = pd.read_csv(io.StringIO(uploaded['x_train.csv'].decode('utf-8')), skiprows=1, usecols=range(23) ,header=None)