python - 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 文件?
谢谢你。
解决方案
这是我对您的问题的快速解决方案-
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')
推荐阅读
- c# - 无法将 IIS 托管应用程序写入 Ubuntu 中的共享文件夹,但 IISExpress 没有问题
- java - 带有选项卡的 Vaadin 14 对话框
- mysql - 在 wordpress 中从本地连接到服务器 phpmyadmin 数据库
- wordpress - 如何禁用 Google Maps API?
- excel - 保护工作表的代码 - 没有特定工作表的密码无法查看
- vue.js - Vuex 状态仅在局部变异范围内更新
- html - 摆脱多余的空间
- python - AttributeError: 'datetime.timezone' 对象在尝试运行 Apache Airflow 调度程序时没有属性'name'
- google-cloud-platform - 如何在 GDM 模板中使用提供的密码创建用户?
- azure - 如果触发了特定的工件,则表达式验证 azure devops