pandas read_csv 最后一列含有逗号

3 投票
3 回答
3365 浏览
提问于 2025-04-18 08:55

我有一个CSV格式的数据集,按照我的理解,这个数据集的结构是正确的。我想用pandas这个库来正确加载它。这个数据集的表头有5个列名,但最后一列是一些包含未转义逗号的JSON对象。例如:

A,B,C,D,E
1,2,3,4,{K1:V1,K2:V2}

我用一个简单的命令来加载数据:training = pd.read_csv('data/training.dat')

但是,pandas显然把额外的逗号误认为是新的没有标签的列,所以我遇到了这样的错误:

CParserError: Error tokenizing data. C error: Expected 75 fields in line 3, saw 84

我在尝试查看文档,但显然没有成功,有人知道怎么正确配置pd.read_csv命令来正确解析这个数据吗?

我想,另一种办法是我可以写个脚本,把这些JSON对象展开,使用它们的键作为列。

3 个回答

1

不需要对csv文件进行预处理,只需使用Python引擎:

dataset = pd.read_csv('sample.csv', sep=',', engine='python')
2

我觉得这要看你想用JSON做什么。如果你只是想忽略它,最简单的方法可能是把注释符号设置为{(对于这个和下一个,我假设你其他列里没有大括号)。

pd.read_csv(
    'woo.csv',
    comment='{' 
)

其实可以用自定义的分隔符通过read_csv来提取JSON里的元素,不过我并不觉得这是个明智的做法。Pandas会把分隔符变成一列,如果它是一个捕获组(它内部使用re.split),这样我就能得到一列包含JSON的内容。不幸的是,这样也会产生很多空列;所以我才需要用dropna来处理。

我把JSON通过loadsdumps处理了一下,不过显然你会想做一些更合理的事情。:)

json_bit = lambda x: json.dumps(json.loads(x))

pd.read_csv(
    'woo.csv', 
    sep=r'(\{.*\})$|,', 
    converters={'None.3': json_bit}
).dropna(axis=1)

示例CSV

A,B,C,D,E
1,2,3,4,{"K1":"V1","K2":"V2"}
3,2,3,4,{"K1": "V1", "k£": {"k3": "v3"},  "K2":"V2"}
4

如果你能把 { 替换成 "{,把 } 替换成 }",那么可以用下面这个方法正确读取数据: pd.read_csv('data/training.dat',quotechar='"',skipinitialspace=True)

补充:

或者你也可以使用基于正则表达式的解决方案:

In [205]:
print pd.read_csv('a.data',sep=",(?![^{]*\})", header=None)
   0  1  2  3              4
0  A  B  C  D              E
1  1  2  3  4  {K1:V1,K2:V2}

[2 rows x 5 columns]

撰写回答