在Python和Pandas中读入.csv的一种非常通用的方法是什么?

发布于 2021-01-29 16:47:05

我有一个.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

错误。我知道我可以使用

names=my_cols

read_csv调用中的选项,但是肯定有比这更“ 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
关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    好的,这个问题在一定程度上受到了启发:将可变数目的列转换为二进制矩阵

    因此,请阅读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,我们可以使用withexpand=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上面的



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看