在Python和pandas中读取.csv的一种非常普遍的方法是什么?

2024-04-19 19:36:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.csv文件,其中的行具有多个列的长度。在

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

返回

^{pr2}$

错误。我知道我可以用

names=my_cols 

在read_csv调用中的选项,但肯定有比这更“python”的东西??而且,这不是一个重复的问题,因为

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

Tags: 文件csvfrankimportpandasreadaspd
2条回答

在使用pandas之前,可以使用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,但应该可以工作。我有时间就把它清理干净。

或者用另一个答案,它是整洁的。

好吧,有点受这个相关问题的启发: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将名称展开到它们自己的列中:

^{pr2}$

所以为了清楚起见,请将read_csv行修改为:

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

然后执行上面的str.split

相关问题 更多 >