pandas read_csv,最后一栏包含逗号

时间:2014-06-06 22:09:22

标签: python json csv pandas

所以我有一个csv数据集,我的书很好,并且我试图让pandas包正确加载它。标题由5个列名组成,但最后一列由包含未转义逗号的JSON对象组成。 e.g。

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

我使用简单的training = pd.read_csv('data/training.dat')

加载我的数据

然而,大熊猫显然将其他逗号误解为新的未标记列,并且我收到如下错误:

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

我试图导航文档,但显然失败了,是否有人知道如何正确配置pd.read_csv命令以正确解析它?

我想另一种选择是我可以将一个密钥联合作为列来整合JSON对象的脚本。

3 个答案:

答案 0 :(得分:3)

如果您可以将{替换为"{,将}替换为}",则可以通过以下方式正确读取: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]

答案 1 :(得分:2)

我认为这取决于您尝试使用JSON做什么。如果您只是想忽略它,可能最简单的方法是将评论字符设置为{(对于此和下一个,我假设您在其他列中没有任何大括号。)

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

可以使用read_csv的自定义分隔符从JSON中提取元素,尽管我完全不相信这是一种明智的方法。如果它是一个捕获组(它在内部使用re.split),Pandas会将分隔符变成一列,所以我可以得到一个包含JSON的列。不幸的是,由于这个原因我也得到了一大堆空列;因此dropna

我通过loadsdumps发送了JSON,但显然你想要做一些更明智的事情。 :)

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"}

答案 2 :(得分:0)

无需预处理csv文件,只需使用引擎类型python:

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