首页 > 解决方案 > Pandas pd.read_csv 不适用于简单的 sep=','

问题描述

大家下午好。

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

任务如下:

我有一个文件 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 文件?

谢谢你。

标签: pythonpandascsv

解决方案


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

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

推荐阅读