我正在尝试编写一个简单的记录分类器.我想添加一列,其值对记录进行分类.我想将分类规则编入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.