【问题标题】:Pandas pd.read_csv does not work for simple sep=','Pandas pd.read_csv 不适用于简单的 sep=','
【发布时间】:2018-11-24 16:52:37
【问题描述】:

大家下午好。

我知道这是一个很简单的问题,但我就是不明白为什么它不能按我预期的方式工作。

任务如下:

我有一个以这种格式显示的文件 data.csv:

id,"feature_1","feature_2","feature_3"
00100429,"PROTO","Proprietary","Phone"
00100429,"PROTO","Proprietary","Phone"

问题是使用 pandas 导入这些数据。我知道默认情况下 pandas read_csv 使用逗号分隔符,所以我只是将其导入如下:

data = pd.read_csv('data.csv')

而我得到的结果是我一开始呈现的,完全没有变化。我的意思是一列包含所有内容。

我使用正则表达式尝试了许多其他分隔符,唯一做出某种改进的分隔符是:

data = pd.read_csv('data.csv',sep="\,",engine='python')

一方面它最终将所有列分开,另一方面数据的呈现方式使用起来并不方便。特别是:

"id         ""feature_1""   ""feature_2""   ""feature_3"""
"00100429   ""PROTO""       ""Proprietary"" ""Phone"""

因此,我认为某处一定是错误的,因为数据似乎很好。

所以问题是 - 如何导入具有分隔列且没有三引号符号的 csv 文件?

谢谢。

【问题讨论】:

  • 我认为还有另一种格式,就像您提到的have a file data.csv presented in this format:,因为您的示例数据与sep=',' 一起工作非常好。你能创建更好的数据样本来返回你的错误输出吗?
  • 你的问题在这里sep="\,",只需使用sep=","不要放``

标签: python pandas csv


【解决方案1】:

这是我对您问题的快速解决方案 -

import numpy as np
import pandas as pd

### Reading the file, treating header as first row and later removing all the double apostrophe 
df = pd.read_csv('file.csv', sep='\,', header=None).apply(lambda x: x.str.replace(r"\"",""))
df

    0              1           2       3
0   id      feature_1   feature_2   feature_3
1   00100429    PROTO   Proprietary Phone
2   00100429    PROTO   Proprietary Phone

### Putting column names back and dropping the first row.
df.columns = df.iloc[0]
df.drop(index=0, inplace=True)
df

## You can reset the index 
        id  feature_1   feature_2   feature_3
1   00100429    PROTO   Proprietary Phone
2   00100429    PROTO   Proprietary Phone

### Converting `id` column datatype back to `int` (change according to your needs)

df.id = df.id.astype(np.int)
np.result_type(df.id)

dtype('int64')

【讨论】:

  • 感谢您的帮助,我尝试了这个解决方案,效果很好。事实上,我尝试用 excel 打开这个数据集,但它没有显示任何问题(这就是为什么我认为问题出在代码上),但是,当我使用 python 的 open('file.csv', 'r'),我发现这些行是这样呈现的 - '"tac,""vendor"",""platform"",""type"""\n' 这清楚地说明了为什么我在阅读时遇到这样的问题它使用熊猫。再次感谢您的帮助。
  • @kakalukia 很高兴听到它有帮助。此外,如果它是 excel 可以处理的小数据集,那么您可以简单地将一列拆分为不同的列,然后在 Python 中导入。这样一来,很多事情都会被简化。进展顺利,你也可以投票赞成这个答案:)
【解决方案2】:

这只是dataLeo's 答案的另一种方式-

import pandas as pd
import numpy as np

在数据框中读取文件,然后从行值中删除所有双撇号

df = pd.read_csv("file.csv", sep="\,").apply(lambda x: x.str.replace(r"\"",""))
df

    "id"   "feature_1"  "feature_2" "feature_3"
0   00100429    PROTO   Proprietary Phone
1   00100429    PROTO   Proprietary Phone

从列名中删除所有双撇号

df.columns = df.columns.str.replace('\"', '')
df

      id    feature_1   feature_2   feature_3
0   00100429    PROTO   Proprietary Phone
1   00100429    PROTO   Proprietary Phone

id 列数据类型转换回int(根据需要更改)

df.id = df.id.astype('int')
np.result_type(df.id)

dtype('int32')

【讨论】:

    【解决方案3】:

    sep 应该没有任何问题,直到您拥有的 CSV 文件有任何问题,但是模拟您的数据示例它对我来说是有效的文件:

    根据您的数据样本,您不需要为逗号分隔的值转义字符 \

    >>> import pandas as pd
    >>> data = pd.read_csv("sample.csv", sep=",")
    >>> data
           id feature_1    feature_2 feature_3
    0  100429     PROTO  Proprietary     Phone
    1  100429     PROTO  Proprietary     Phone
    >>> pd.__version__
    '0.23.3'
    

    这里有个问题,我注意到sep="\,"

    或者尝试:

    • 这里skipinitialspace=True - 这“处理逗号分隔符后的空格”

    • quotechar='"' : string (length 1) 用于表示引用项的开始和结束的字符。引用的项目可以包含分隔符,它将被忽略。

    所以,在那种情况下值得一试..

    >>> data1 = pd.read_csv("sample.csv", skipinitialspace = True, quotechar = '"')
    >>> data1
           id feature_1    feature_2 feature_3
    0  100429     PROTO  Proprietary     Phone
    1  100429     PROTO  Proprietary     Phone
    

    来自 Pandas 文档的注释:

    超过 1 个字符且不同于 '\s+' 的分隔符将是 解释为正则表达式,将强制使用 python 解析引擎,将忽略数据中的引号。

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 2018-05-03
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2021-12-26
      相关资源
      最近更新 更多