什么是在Python和熊猫中读入.csv的非常通用的方法?

问题描述:

我有一个.csv文件,具有多列长度的行。什么是在Python和熊猫中读入.csv的非常通用的方法?

import pandas as pd 
df = pd.read_csv(infile, header=None) 

返回

ParserError: Error tokenizing data. C error: Expected 6 fields in line 8, saw 8 

错误。我知道我可以在read_csv调用中使用

names=my_cols 

选项,但肯定会有比这更“pythonic”的东西?此外,这不是重复的问题,因为

error_bad_lines=False 

导致行被跳过(这是不希望的)。该.csv看起来像::

Anne,Beth,Caroline,Ernie,Frank,Hannah 
Beth,Caroline,David,Ernie 
Caroline,Hannah 
David,,Anne,Beth,Caroline,Ernie 
Ernie,Anne,Beth,Frank,George 
Frank,Anne,Caroline,Hannah 
George, 
Hannah,Anne,Beth,Caroline,David,Ernie,Frank,George 
+1

如果没有真正看到你的csv的实际外观,这个错误可能是因为你的列名和实际列之间不匹配,你嵌入了逗号,你的分隔符不是逗号等。 – EdChum

+0

什么你期望你的'df'看起来像吗? – GiantsLoveDeathMetal

+0

这不是上述问题的重复,因为“error_bad_lines = False”会导致行被跳过。我不想要那种行为。 – npross

OK,一定程度上受到此相关的问题启发:Pandas variable numbers of columns to binary matrix

在CSV所以阅读,但覆盖分离器的选项卡,以便它不会尝试拆分名:

In[7]: 
import pandas as pd 
import io 
t="""Anne,Beth,Caroline,Ernie,Frank,Hannah 
Beth,Caroline,David,Ernie 
Caroline,Hannah 
David,,Anne,Beth,Caroline,Ernie 
Ernie,Anne,Beth,Frank,George 
Frank,Anne,Caroline,Hannah 
George, 
Hannah,Anne,Beth,Caroline,David,Ernie,Frank,George""" 
df = pd.read_csv(io.StringIO(t), sep='\t', header=None) 
df 

Out[7]: 
                0 
0    Anne,Beth,Caroline,Ernie,Frank,Hannah 
1       Beth,Caroline,David,Ernie 
2         Caroline,Hannah 
3     David,,Anne,Beth,Caroline,Ernie 
4      Ernie,Anne,Beth,Frank,George 
5       Frank,Anne,Caroline,Hannah 
6           George, 
7 Hannah,Anne,Beth,Caroline,David,Ernie,Frank,Ge... 

我们现在可以使用str.splitexpand=True的名字扩展到自己的列:

In[8]: 
df[0].str.split(',', expand=True) 

Out[8]: 
      0   1   2   3   4  5  6  7 
0  Anne  Beth Caroline  Ernie  Frank Hannah None None 
1  Beth Caroline  David  Ernie  None None None None 
2 Caroline Hannah  None  None  None None None None 
3  David    Anne  Beth Caroline Ernie None None 
4  Ernie  Anne  Beth  Frank George None None None 
5  Frank  Anne Caroline Hannah  None None None None 
6 George    None  None  None None None None 
7 Hannah  Anne  Beth Caroline  David Ernie Frank George 

所以只要是明确的修改read_csv线这样的:

df = pd.read_csv(infile, header=None, sep='\t') 

然后执行str.split如上

+0

'(1,3)'发生了什么? – GiantsLoveDeathMetal

+1

@GiantsLoveDeathMetal这些是缺少值,所以它看起来像被视为空/空字符串,他们可以用'None'轻松替换,但感谢您指出这一点。 – EdChum

+0

对不起,我是由不一致性引发的。 :) – GiantsLoveDeathMetal

人们可以利用熊猫之前做一些操作与CSV。

# load data into list 
with open('new_data.txt', 'r') as fil: 
    data = fil.readlines() 

# remove line breaks from string entries 
data = [ x.replace('\r\n', '') for x in data] 
data = [ x.replace('\n', '') for x in data] 

# calculate the number of columns 
total_cols = max([x.count(',') for x in data]) 

# add ',' to end of list depending on how many are needed 
new_data = [x + ','*(total_cols-x.count(',')) for x in data] 

# save data 
with open('save_data.txt', 'w') as outp: 
    outp.write('\n'.join(new_data)) 

# read it in as you did. 
pd.read_csv('save_data.txt', header=None) 

这是一些粗糙的Python,但应该工作。有空的时候我会清理它。

或使用其他答案,它很整洁。

+0

在将数据读入主程序之前,我没有任何问题需要使用csv_manipulation函数! ;-) – npross