python - 将列数多于预期的数据读入数据框中
问题描述
我有许多 .csv 文件下载到一个目录中。
每个 .csv 都假设有 3 列信息。这些文件之一的头部如下所示:
17/07/2014,637580,10.755
18/07/2014,61996,10.8497
21/07/2014,126758,10.8208
22/07/2014,520926,10.8201
23/07/2014,370843,9.2883
我用来将 .csv 读入数据帧 (df) 的代码是:
df = pd.read_csv(adj_directory+'\\'+filename, error_bad_lines=False,names=['DATE', 'PX', 'RAW'])
我在其中命名三列(DATE、PX 和 RAW)。
当文件格式正确时,这可以正常工作。但是我注意到有时 .csv 的格式略有不同,例如:
09/07/2014,26268315,,
10/07/2014,6601181,16.3857
11/07/2014,916651,12.5879
14/07/2014,213357,,
15/07/2014,205019,10.8607
其中缺少列值,并且值位置中出现额外的逗号。这意味着文件无法加载到数据框中(df
数据框为空)。
有没有办法用额外的逗号(忽略违规行)将数据读入数据帧,所以df
看起来像:
09/07/2014,26268315,NaN
10/07/2014,6601181,16.3857
11/07/2014,916651,12.5879
14/07/2014,213357,NaN
15/07/2014,205019,10.8607
解决方案
可能最好在上游修复文件,以便缺失值不会用,
. ,,
但如有必要,您可以在 python 中更正文件,只需,
(逐行)替换。将您的错误文件视为test.csv
:
import re
import csv
patt = re.compile(r",,")
with open('corrected.csv', 'w') as f2:
with open('test.csv') as f:
for line in csv.reader(map(lambda s: patt.sub(',', s), f)):
f2.write(','.join(str(x) for x in line))
f2.write('\n')
f2.close()
f.close()
输出:corrected.csv
09/07/2014,26268315,
10/07/2014,6601181,16.3857
11/07/2014,916651,12.5879
14/07/2014,213357,
15/07/2014,205019,10.8607
然后你应该可以毫无问题地读入这个文件
import pandas as pd
df = pd.read_csv('corrected.csv', names=['DATE', 'PX', 'RAW'])
DATE PX RAW
0 09/07/2014 26268315 NaN
1 10/07/2014 6601181 16.3857
2 11/07/2014 916651 12.5879
3 14/07/2014 213357 NaN
4 15/07/2014 205019 10.8607
推荐阅读
- java - 从 Firebase 实时数据库获取的数据未显示在我的 RecyclerView 中
- r - 如何重新格式化数据,使 ID 对应两行,一行包含样本源,第二行包含源的结果
- python - 旋转图像后计算属于矩形角的像素
- docker - 将 jenkins 机密文件传递给 docker image run
- discord.py - Discord.py 嵌入只显示一个词
- c - C - 变量的类型不完整“struct ...”
- spring - 无法在 Spring Boot 中使用 JUnit 5 模拟 RestTemplate
- html - 删除 CSS 列上的额外底部填充
- c# - 将样式设置为 wpf 自定义控件会覆盖所有内容
- javascript - Ionic Vue Modal 显示内容两次