Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将DataFrame.filter与Python中包含unicode的正则表达式一起使用?_Python_Unicode - Fatal编程技术网

如何将DataFrame.filter与Python中包含unicode的正则表达式一起使用?

如何将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

我试图用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-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])
获取列匹配的另一个选项是使用Python
filter
函数,如:

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))