【问题标题】:Import CSV file where last column has many separators [duplicate]导入最后一列有许多分隔符的 CSV 文件 [重复]
【发布时间】:2020-09-13 10:05:15
【问题描述】:

数据集如下所示:

region,state,latitude,longitude,status
florida,FL,27.8333,-81.717,open,for,activity
georgia,GA,32.9866,-83.6487,open
hawaii,HI,21.1098,-157.5311,illegal,stuff
iowa,IA,42.0046,-93.214,medical,limited

如您所见,最后一列有时会有分隔符。这使得使用read_csv() 导入 中的CSV 文件变得很困难。我可以导入文件的唯一方法是将参数 error_bad_lines=False 添加到函数中。但是这样我会丢失一些数据。

如何在不丢失数据的情况下导入 CSV 文件?

【问题讨论】:

    标签: pandas python python-3.x pandas


    【解决方案1】:

    我会将文件作为一列读取并手动解析:

    df = pd.read_csv(filename, sep='\t')
    
    pat = ','.join([f'(?P<{x}>[^\,]*)' for x in ['region','state','latitude','longitute']])
    pat = '^'+ pat + ',(?P<status>.*)$'
    
    df = df.iloc[:,0].str.extract(pat)
    

    输出:

        region state latitude  longitute             status
    0  florida    FL  27.8333    -81.717  open,for,activity
    1  georgia    GA  32.9866   -83.6487               open
    2   hawaii    HI  21.1098  -157.5311      illegal,stuff
    3     iowa    IA  42.0046    -93.214    medical,limited
    

    【讨论】:

    • 顺便说一句,您介意解释一下代码吗?我在理解第 2 行和第 3 行时遇到了一些麻烦
    • 第2行和第3行基本提取了对应的组。 '?P` 是组命名的正则表达式,因此我们稍后可以使用正确的名称。 [^\,]* 表示捕获所有非逗号字符。您可以在这两行之后打印pat 并将其粘贴到regex101 以获取更多详细信息。
    【解决方案2】:

    您是否尝试过使用 split 函数的老式技术?一个主要的缺点是,如果您的数据在前 4 个字段/列中的任何一个中有 ,,您最终会丢失数据或遇到错误,但如果没有,您可以使用它。

    data = open(file,'r').read().split('\n')
    for line in data:
        items = line.split(',',4). # Assuming there are 4 standard columns, and the 5th column has commas
    

    每一行 items 看起来像这样:

    ['hawaii', 'HI', '21.1098', '-157.5311', 'illegal,stuff']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2013-10-16
      • 2023-03-31
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多