Pandas:选择包含Unicode字符的字符串

3

我尝试通过指定其中一列的值来选择行。只要所选值为纯 ASCII 字符,就可以完美地工作。但是如果包含非 ASCII 字符,则无论我如何编码该值,都无法使其正常工作。

以下是简化的示例,以说明问题:

>>> from __future__ import (absolute_import, division, 
                            print_function, unicode_literals)
>>> import pandas as pd
>>> df = pd.DataFrame([[1, 'Stuttgart'], [2, 'München']], columns=['id', 'city'])
>>> df['city'] = df['city'].map(lambda x: x.encode('latin-1'))
>>> store = pd.HDFStore('test_store.h5')
>>> store.append('test_key', df, data_columns=True)
>>> store['test_key']
   id       city
0   1  Stuttgart
1   2    M�nchen

请注意,非ASCII字符串确实被正确存储:
>>> store['test_key']['city'][1]
'M\xfcnchen'

选择ASCII值的工作完美地进行:
选取 ASCII 值的效果非常好:
>>> store.select('test_key', where='city==%r' % 'Stuttgart')
   id       city
0   1  Stuttgart

但是选择非 ASCII 值无法返回行:

>>> store.select('test_key', where='city==%r' % 'München')
Empty DataFrame
Columns: [id, city]
Index: []

>>> store.select('test_key', where='city==%r' % 'München'.encode('latin-1'))
Empty DataFrame
Columns: [id, city]
Index: []

显然我做错了什么...如何解决这个问题?
2个回答

1
奇怪的是,如果编码为utf-8而不是latin-1,选择似乎可以正常工作:
from __future__ import (absolute_import, division, 
                        print_function, unicode_literals)

import pandas as pd

df = pd.DataFrame([[1, 'Stuttgart'], [2, 'München']], columns=['id', 'city'])
df['city'] = df['city'].map(lambda x: x.encode('utf-8'))
store = pd.HDFStore('/tmp/test_store.h5', 'w')
store.append('test_key', df, data_columns=True)
print(store.select('test_key', where='city==%r' % 'Stuttgart'.encode('utf-8')))
#    id       city
# 0   1  Stuttgart

print(store.select('test_key', where='city==%r' % 'München'.encode('utf-8')))
#    id     city
# 1   2  München

store.close()

好的,我把这个归类为“奇怪”。;-) 鉴于 utf-8 编码可行,解决这种“奇怪”的问题也很容易。而且额外的好处是,pandas 的输出格式也支持 utf-8!非常感谢您指出这个修复方法。 - ARF

0

看起来 PyTables 3.1.1 可能不支持 Unicode 列。虽然我不是 PyTables 的用户,但这个 错误报告 表明这是一个已知问题,被推迟到版本 3.2。这个 其他问题 也许相关。


谢谢,但我根本没有存储Unicode。我使用普通的字符串列并存储ASCII编码的Unicode。即不是直接存储“München”,而是“M \ xfcnchen”。因此,应该可以查询此ASCII字符串。我查看了错误报告,但据我所见,他们正在处理存储ASCII编码的Unicode的字符串列,而不是Unicode列。-如果我误解了您,请告诉我。 - ARF

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