当使用.astype('|S')转换列时,Pandas在to_csv前缀'b'。

3
我正在遵循这篇文章的建议,来减少Pandas DataFrame的内存使用。我正在像这样在一个对象列上使用.astype('|S')
data_frame['COLUMN1'] = data_frame['COLUMN1'].astype('|S')
data_frame['COLUMN2'] = data_frame['COLUMN2'].astype('|S')

在DataFrame上执行此操作可将内存使用量减少20-40%,而不会对处理列产生负面影响。但是,当使用.to_csv()输出文件时:

data_frame.to_csv(filename, sep='\t', encoding='utf-8')

.astype('|S')的列输出时带有单引号b的前缀:

b'00001234'  b'Source'

去掉 `.astype('|S')` 函数并将结果输出到 csv 文件中,即可得到预期的结果:
00001234  Source

这个问题在谷歌上可以找到GitHub的相关问题,但我认为它们与这个问题不相关(看起来它们也已经被修复):to_csv和Python 3中的字节BUG:修复CSVFormatter.save的默认编码 我使用的是Python 3.6.4和Pandas 0.22.0。我测试了在MacOS和Windows上行为一致。有什么建议可以在没有b前缀和单引号的情况下输出列?
1个回答

3

'b'前缀表示Python 3中的字节literal,它表示一个对象而不是unicode字符串。因此,如果您想要删除前缀,可以在保存到csv文件之前使用字符串解码方法对字节对象进行解码:

data_frame['COLUMN1'] = data_frame['COLUMN1'].apply(lambda s: s.decode('utf-8'))

谢谢 - 运行正常。在pandas中,字符串和对象有最佳实践吗?除了我提到的文档之外,我还没有做更多的阅读,但似乎pandas没有本地字符串类型。 - Brett VanderHaar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接