我尝试使用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?
答案 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
作为条件,而根本不加载正则表达式库。