我正在尝试编写一个简单的记录分类器.我想添加一列,其值对记录进行分类.我想将分类规则编入Yaml或类似文件中,以进行维护.
我正在使用Pandas,因为这似乎是使用python中的csv记录执行此操作的最佳方法.我愿意接受其他建议.我是熊猫新手,我的python技能被礼貌地描述为“为什么看起来像perl?”
我已经获得一个数据框(反式),我想按如下方式应用规则:
trans [‘class’] [(trans [‘foo’]> 5)& (trans [‘bar’].str.contains(re.compile(‘baz | one | two’,re.I))] =’记录类型1′
这可以交互工作.我希望能够生成分类索引“((trans [‘foo’]> 5)&(trans [‘bar’].str.contains(re.compile(‘baz | one | two’, re.I))”从yaml文件中的每个规则动态生成.我已经成功构建了字符串,使我拥有以下内容:
slice =“(trans [‘foo’]> 5)&(trans [‘bar’].str.contains(re.compile(‘baz | one | two’,re.I))”“
trans [‘class’] [slice] =’记录类型1′
这行不通.我应该怎么做呢?
解决方法:
需要注意的几点:
>引号表示Python中的字符串.不要使用它们来包围布尔掩码的计算.
>不要使用链接索引.在文档中为explicitly discouraged,可能会导致意外的副作用,或者在修改视图还是副本时会产生歧义.您可以改用pd.DataFrame.loc
.
> pd.Series.str.contains
已经支持正则表达式,并且默认值为regex = True,您不需要使用re模块.
为了提高可读性,您可以拆分和组合遮罩.这是一个例子:
m1 = trans['foo'] > 5
m2 = trans['bar'].str.contains('baz|one|two', case=False)
trans.loc[m1 & m2, 'class'] = 'Record Type 1'
通常昂贵的部分,m2的计算,可以通过使用专家算法进行优化,有关详细信息,请参见this answer.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。