2017-04-16 57 views
0

我想用一个unicode正则表达式来过滤DataFrame的列。我需要代码与python2和python3兼容。如何将DataFrame.filter与包含unicode的regex一起使用?

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

这个问题与你的问题有关:https://stackoverflow.com/questions/9942594/unicodeencodeerror-ascii-codec-cant-encode-character-u-xa0-in-position-20 – Craig

+0

这个打开的bug报告熊猫看起来像描述了你的问题:https://github.com/pandas-dev/pandas/issues/13101 – Craig

+0

似乎我可以使用sys.setdefaultencoding(“utf-8”)来解决问题。但它说为了避免这 - http://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script – user1633272

回答

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

另一种获取列的选项UMN匹配是使用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为准则,而不是在所有加载regex库。

+0

谢谢,看起来不错,让我试试看。 – user1633272

相关问题