这是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。
我的问题:
我已经尝试了所有级别的引用(即[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)
答案 0 :(得分:0)
CSV需要能够以可以重新加载的方式存储数据,因此,escapes必须具有含义的字符(特别是逗号,它们是默认的列定界符,以及单个引号,否则将终止您的字符串)。
要将其转换为转义格式,可以使用eval:
input = '[\'this\', \'is\', \'"out text"\']'
output = eval(input)
该操作也可以在数据帧的整个列上执行。