pandas read_csv,最后一列包含逗号

Posted

技术标签:

【中文标题】pandas read_csv,最后一列包含逗号【英文标题】:pandas read_csv with final column containing commas 【发布时间】:2014-07-28 06:52:03 【问题描述】:

所以我有一个 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 对象。

【问题讨论】:

【参考方案1】:

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

【讨论】:

我真的很喜欢基于正则表达式的解决方案。我没有意识到 sep 可以解析正则表达式。【参考方案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"

【讨论】:

【参考方案3】:

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

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

【讨论】:

这似乎不能解决问题。我看不出指定引擎类型如何使列条目被解释为dict

以上是关于pandas read_csv,最后一列包含逗号的主要内容,如果未能解决你的问题,请参考以下文章

尾随分隔符使熊猫 read_csv 感到困惑

numpy genfromtxt/pandas read_csv;忽略引号内的逗号

在r中查找字符串中最后一个逗号的位置[重复]

pandas使用read_csv函数读取文件最后N行数据并保留表头pandas使用read_csv函数读取网络url链接数据

pandas.read_csv

为 pandas.read_csv 指定正确的 dtypes 以获取日期时间和布尔值