大熊猫to_csv read_csv在jupyter上的字符串数组中的引号

时间:2019-03-08 15:09:38

标签: python pandas

这是pandas to_csv output quoting issue的后续文章。

说,我用文本数据创建一个数据框。此文本数据存储为字符串列表:

In [1]: import pandas as pd

In [2]: text = ['this', 'is', '"out text"']
   ...: df_pre = pd.DataFrame(index=['1'], columns=['one','two'])
   ...: df_pre.loc['1','one'] = 123
   ...: df_pre.loc['1','two'] = text

检查预读数据框的列:

In [3]: df_pre
Out[3]: 
   one                     two
1  123  [this, is, "out text"]

In [4]: df_pre.two.iloc[0]
Out[4]: ['this', 'is', '"out text"']

这正是我想要的方式:df.two是一个字符串列表,并且保留string元素内的引号。

但是当我编写然后以CSV格式读取df时:

In [5]: df_pre.to_csv('foo.txt', index=False)
In [5]: df_post = pd.read_csv('foo.txt')

我看到df.two的表示方式有所不同,因此帖子-读取的数据框中现在有其他引号:

In [6]: df_post
Out[6]: 
   one                           two
0  123  ['this', 'is', '"out text"']

在这里:

In [7]: df_post.two.iloc[0]
Out[7]: '[\'this\', \'is\', \'"out text"\']'

这样做的问题是,如果我想遍历df.two列中每一行的每个字符串元素,我必须应对包裹每个元素的附加引号。因此,如果我想使用 post 数据框来计算“发生”的次数,我将得到0。

我的问题:

  1. 为什么会这样?
  2. 如何防止它发生?

我已经尝试了所有级别的引用(即[0,3]),但无济于事。我的目标是处理多行文本数据(标记,词干等),并将工作保存为csv格式以备后用。


作为后续,我希望发布看起来像之前

前提(不带引号)

In [8]: df_pre
Out[8]: 
   one                     two
1  123  [this, is, "out text"]

发布(带有附加引号):

In [9]: df_post
Out[9]: 
   one                           two
0  123  ['this', 'is', '"out text"']

解决方案

df_post.two = df_post.two.apply(eval)

1 个答案:

答案 0 :(得分:0)

CSV需要能够以可以重新加载的方式存储数据,因此,escapes必须具有含义的字符(特别是逗号,它们是默认的列定界符,以及单个引号,否则将终止您的字符串)。

要将其转换为转义格式,可以使用eval:

input = '[\'this\', \'is\', \'"out text"\']'
output = eval(input)

该操作也可以在数据帧的整个列上执行。