如何在Python中使用包含unicode的regex的DataFrame.filter?

时间:2017-04-16 13:09:53

标签: python unicode

我尝试使用unicode正则表达式过滤DataFrame的列。我需要代码兼容python2和python3。

df.filter(regex=u'证券代码')

代码在python2中抛出错误

  File "D:\Applications\Anaconda2\lib\site-packages\pandas\core\generic.py", line 2469, in filter
    axis=axis_name)
  File "D:\Applications\Anaconda2\lib\site-packages\pandas\core\generic.py", line 1838, in select
    np.asarray([bool(crit(label)) for label in axis_values])]
  File "D:\Applications\Anaconda2\lib\site-packages\pandas\core\generic.py", line 2468, in <lambda>
    return self.select(lambda x: matcher.search(str(x)) is not None,
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

所以,我写了一个单元测试:

class StrTest(unittest.TestCase):
    def test_str(self):
        str(u'证券代码')

报告同样的错误。

有关此错误的任何想法?如何使用unicode正则表达式过滤DataFrame?

1 个答案:

答案 0 :(得分:1)

我只能在Python 2.7中重现这个问题。对于Python 2.7环境,有几种解决方法:

这是我使用的数据框

# -*- coding: utf-8 -*-
import pandas as pd 

df = pd.DataFrame( {'ascii':range(10), u'证券代码':range(10,20)}); 

1)切片表示法

使用正则表达式直接过滤列名列表,然后使用标准索引来选择这些列:

import re
matches = [c for c in df.columns if re.search(u'证券代码',c)]
print(df[matches])

获取列匹配的另一个选项是使用Python filter函数,如:

colpattern = re.compile(u'证券代码')
matches = list(filter(colpattern.search, df.columns))

2)DataFrame.select()

您可以为.select()指定匹配功能。这允许您指定正则表达式或任何其他代码以匹配列名。

import re
print(df.select(lambda c: re.search(u'证券代码',c), axis=1))

注意:对于像这样简单的正则表达式,您可以使用u'证券代码' in c作为条件,而根本不加载正则表达式库。