首页 > 解决方案 > 将列数多于预期的数据读入数据框中

问题描述

我有许多 .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

标签: pythonpandas

解决方案


可能最好在上游修复文件,以便缺失值不会用,. ,,但如有必要,您可以在 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

推荐阅读