如何将DataFrame.filter与Python中包含unicode的正则表达式一起使用?
我试图用unicode正则表达式过滤数据帧的列。我需要代码与python2和python3兼容如何将DataFrame.filter与Python中包含unicode的正则表达式一起使用?,python,unicode,Python,Unicode,我试图用unicode正则表达式过滤数据帧的列。我需要代码与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
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)
它报告了相同的错误
你知道这个错误吗?如何使用unicode正则表达式过滤数据帧?我只能在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])
获取列匹配的另一个选项是使用Pythonfilter
函数,如:
colpattern = re.compile(u'证券代码')
matches = list(filter(colpattern.search, df.columns))
2)数据帧。选择()
您可以为.select()
指定匹配函数。这允许您指定正则表达式或任何其他代码来匹配列名
import re
print(df.select(lambda c: re.search(u'证券代码',c), axis=1))
注意:对于这样简单的正则表达式,可以使用
u'证券代码' 以c
作为标准,根本不加载正则表达式库。这个问题与您的问题有关:这个针对pandas的开放式错误报告似乎描述了您的问题:似乎我可以使用sys.setdefaultencoding(“utf-8”)来解决问题。但为了避免这种情况,我试图设置环境pythonionecoding=UTF-8,但没有效果,我无法复制。我使用的是Pandas 19.2和Python3.6,filter()
和str()
命令都可以正常工作。您使用的是什么版本?
import re
print(df.select(lambda c: re.search(u'证券代码',c), axis=1))