如何将DataFrame.filter与包含unicode的regex一起使用?
问题描述:
我想用一个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?
答
我只能在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
这个问题与你的问题有关:https://stackoverflow.com/questions/9942594/unicodeencodeerror-ascii-codec-cant-encode-character-u-xa0-in-position-20 – Craig
这个打开的bug报告熊猫看起来像描述了你的问题:https://github.com/pandas-dev/pandas/issues/13101 – Craig
似乎我可以使用sys.setdefaultencoding(“utf-8”)来解决问题。但它说为了避免这 - http://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script – user1633272