我正试着把CSV文件读入熊猫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个字段,saw 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 \"c\d" e f g h
1 i j k l m n o
2 p q r s t u v 发布于 2021-08-21 04:02:04
试试下面,它符合你的要求..。
样本文件:
$ 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基于最新职位变动的解决方案:
熊猫是处理表格数据的工具。这意味着每一行都应该包含相同数量的字段/行。因此,每一行中的字段应该是相同的顺序。
但是你的输入文件实际上不符合熊猫需要阅读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发布于 2021-08-21 03:15:33
我认为您可以尝试pd.read_csv函数的pd.read_csv参数。我以前从来没有用过这个,我也不能百分之百肯定我理解你的问题。您是尝试将所有行的C&D列组合起来,还是仅在数据中存在这些特殊字符/模式时才这样做?下面是到文档的链接,可能有一些更有用的参数来解决这个问题:熊猫文献
如果您试图对所有行执行此操作,则可能需要创建一个字符串处理助手函数,该函数组合这些数据并删除反斜杠、双引号和逗号。
发布于 2021-08-21 03:24:26
强制列数:
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然后从那里清理等。
https://stackoverflow.com/questions/68869781
复制相似问题