微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-动态建立索引以对熊猫中的记录进行分类

我正在尝试编写一个简单的记录分类器.我想添加一列,其值对记录进行分类.我想将分类规则编入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 举报,一经查实,本站将立刻删除。

相关推荐