熊猫pd.read_csv不适用于简单的sep =','

时间:2018-11-24 07:01:30

标签: python pandas csv

大家下午好。

我知道这是一个很简单的问题,尽管,我根本不理解为什么它不能按我预期的方式工作。

任务如下:

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

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

事情是使用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文件?

谢谢。

3 个答案:

答案 0 :(得分:1)

这只是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')

答案 1 :(得分:0)

在您拥有的CSV文件上确实存在任何不良情况之前,sep应当没有任何问题,但是,通过模拟数据示例,它可以为我工作:

根据您的数据样本,您无需为逗号分隔的值转义char \

>>> 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='"':字符串(长度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

熊猫文档中的注释:

  

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

答案 2 :(得分:0)

这是我为您解决问题的快速方法-

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')