什么是在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
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.split
与expand=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
如上
'(1,3)'发生了什么? – GiantsLoveDeathMetal
@GiantsLoveDeathMetal这些是缺少值,所以它看起来像被视为空/空字符串,他们可以用'None'轻松替换,但感谢您指出这一点。 – EdChum
对不起,我是由不一致性引发的。 :) – 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,但应该工作。有空的时候我会清理它。
或使用其他答案,它很整洁。
在将数据读入主程序之前,我没有任何问题需要使用csv_manipulation函数! ;-) – npross
如果没有真正看到你的csv的实际外观,这个错误可能是因为你的列名和实际列之间不匹配,你嵌入了逗号,你的分隔符不是逗号等。 – EdChum
什么你期望你的'df'看起来像吗? – GiantsLoveDeathMetal
这不是上述问题的重复,因为“error_bad_lines = False”会导致行被跳过。我不想要那种行为。 – npross