大家下午好。
我知道这是一个很简单的问题,尽管,我根本不理解为什么它不能按我预期的方式工作。
任务如下:
我有一个以这种格式显示的文件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文件?
谢谢。
答案 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')