我正在尝试将CSV文件读取为pandas DataFrame。我在CSV上的其中一行上有如下数据模式
a,b,\"c\,d",e,f,g,h --> read as 8 fields currently
而不是常规的
a,b,c,e,f,g,h --> should be read as only 7 fields like the rest
模式在所有其他行
当我使用pd.read_csv (text.csv)读取DataFrame时,得到错误
标记数据错误。C错误:期望在36190行有7个字段,看到8
有没有办法读取数据"c,d"放到一个列里?或者通常处理此类情况的最佳实践是什么?
注意:作为CSV文件的一部分,上面提到的行上的字母只是CSV每行中值的占位符。它们不是列。
如答案所示,这是CSV文件
上的数据当前的样子AA BB CC DD EE FF GG HH
0 a b "c d" e f g h
1 i j k l m n o
2 p q r s t u v
,我想把它读到DataFrame中,如下所示然后去掉引号和反斜杠
AA BB CC DD EE FF GG
0 a b "cd" e f g h
1 i j k l m n o
2 p q r s t u v
试试下面,它符合你的要求…
样本文件:$ cat test.csv
a,b,\"c\,d",e,f,g,h
i,j,k,l,m,n,o
p,q,r,s,t,u,v
基于Post最新变更的解决方案:
Pandas是处理表格数据的工具。这意味着每行应该包含相同数量的字段/行。因此,每行中的字段应该以相同的顺序。
但是您的输入文件实际上不符合pandas需要读取CSV的标准。
在你的情况下,它期望7 fields
在36190
行,但是它看到8
,熊猫不喜欢,因此你需要在处理一些或其他方式之前清理你的数据。
您可以做的是,在读取csv时首先将数据读入单列并进行一些清理,我在下面解释了这些。
希望这将给你一个想法如何继续,请记住,你必须清理你的数据之前,你读到熊猫。
# Read your input file, using read_csv, but as a single column (sep set to a non-used char).
df = pd.read_csv('test.csv', sep='|', names=['col1'])
# Apply to replace with regex and remove backslash chars
df['col1'] = df['col1'].replace(r'(\|\)', '', regex=True)
df['col1']= df['col1'].replace(r'("c,d")', 'cd', regex=True)
# Now save these into a new CSV file
df.to_csv("new.csv")
# Read new csv file again
df2 = pd.read_csv("new.csv")
# drop the `Unnamed: 0'` column as this is not required
df2 = df2.drop('Unnamed: 0', 1)
# Replace the unwanted chars in order to get the rows with same length
df2['col1'] = df2['col1'].replace(r'(,d"|")', '', regex=True)
df2 = df2['col1'].replace(r'(,d"|")', '', regex=True).str.split(",", expand=True).rename(columns={0:'AA',1:'BB',2:'CC',3:'DD',4:'EE',5:'FF',6:'GG'})
结果:
print(df2)
AA BB CC DD EE FF GG
0 a b cd e f g h
1 i j k l m n o
2 p q r s t u v
我认为您可以尝试pd.read_csv
函数的escapechar
参数。我以前从来没有使用过这个,我不能100%确定我理解你的问题。您是否试图将C &D适用于所有行,还是仅当这些特殊字符/模式存在于数据中时?这里是文档的链接,可能有一些更有用的参数来解决这个问题:Pandas文档
如果您试图对所有行执行此操作,您可能需要创建一个字符串处理辅助函数来组合这些数据并删除反斜杠,双引号和逗号。
强制列数:
df = pd.read_csv('in.csv', header=None, names=list('12345678'))
输出:
1 2 3 4 5 6 7 8
0 a b c d e f g h
1 a b \"c\ d" e f g h
然后从那里清理等。
可以使用
pd.read_csv('text.csv', sep=',')
首先,引号格式错误,要认为单元格是引号,它需要以引号(或其他选择的引号符号)开始和结束。在您的示例中,它以\
开头,因此它不被视为引用,并且之间的逗号不会被忽略。我不知道这个文件是如何生成的,但如果它是一个这样的情况,尝试手动修复它。如果它出现在多个位置,则需要正确地重新生成它,或者如果不可能,则需要自定义预处理来修复此类情况。一种可能的预处理可能是用另一个唯一的符号替换所有的,
,然后在读取后将其替换回来。