这篇文章是从熊猫到_csv 输出引用问题的后续。比如说,我用文本数据创建了一个数据框。此文本数据存储为字符串列表:In [1]: import pandas as pdIn [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_preOut[3]: one two1 123 [this, is, "out text"]In [4]: df_pre.two.iloc[0]Out[4]: ['this', 'is', '"out text"']这正是我想要的:df.two是一个字符串列表,并且保留了字符串元素中的引号。但是当我写入然后将 df 作为 csv 读取时:In [5]: df_pre.to_csv('foo.txt', index=False)In [5]: df_post = pd.read_csv('foo.txt')我看到df.two已经不同代表,以便有更多的现在报价在后-读取数据帧:In [6]: df_postOut[6]: one two0 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 格式保存工作以供以后操作。作为后续,我希望post看起来像pre:前(没有额外的报价):In [8]: df_preOut[8]: one two1 123 [this, is, "out text"]发表(附有额外引文):In [9]: df_postOut[9]: one two0 123 ['this', 'is', '"out text"']解决方案df_post.two = df_post.two.apply(eval)
1 回答
慕田峪9158850
TA贡献1794条经验 获得超7个赞
CSV 需要能够以可以重新加载的方式存储数据,因此它会转义有意义的字符(特别是逗号,这是默认的列分隔符,以及单引号,否则会终止您的细绳)。
要将其从转义格式转换回,您可以使用 eval:
input = '[\'this\', \'is\', \'"out text"\']' output = eval(input)
该操作也可以在数据帧的整个列上执行。
添加回答
举报
0/150
提交
取消