python - 如何使用正则表达式模式对列进行分类?
问题描述
- 我的问题是如何根据另一列中的内容在新列中添加一些值。
- 在我的具体情况下,我有一个数据框,其中有一列名为
'Flop'
,其中包含 3 个不同类别的字符串值 - 我可以使用正则表达式找到这些“类别”,并且基于每个类别,我想创建另一个名为
'Suitedness'
每个类别名称的列。
我的 df 的一个例子是:
import pandas as pd
df = pd.DataFrame()
df['Flop']=['As 5d 7c','As 9s 3s','8c 7d 5s','8d, As, Js','Qs Ts 8d','7s 2s 2d']
初始数据框
Flop
As 5d 7c
As 9s 3s
8c 7d 5s
8d, As, Js
Qs Ts 8d
7s 2s 2d
我以这种方式解决问题:
Monotone = df[df['Flop'].str.contains('(\ws\s){2}\ws',na=False)]
Monotone['Suitedness']= 'Monotone'
Rainbow = df[df['Flop'].str.contains('(\wc\s.*)+|(\w.\s\wc.*)+|(\w[s,d,c]\s\w[s,d,c]\s\wc)+',na=False)]
Rainbow['Suitedness']= 'Rainbow'
DoubleSuited = df[df['Flop'].str.contains('((\ws\s){2}\w[d,c])+|(\ws\s\w[d,c]\s\ws)+|(\w[d,c]\s\ws\s\ws)+',na=False)]
DoubleSuited['Suitedness']= 'Double Suited'
df2 = pd.concat([Monotone,Rainbow,DoubleSuited])
df2 = df2.sort_index()
- 此代码创建 3 个不同的数据帧,并将它们连接起来。
- 此解决方案有效,但不优雅。
- 我正在寻找更清洁的解决方案。
- 同样,我的正则表达式语法有点乱。
- 这 3 个类别是基于字母 's'、1、2 或 3 's'
- 我还想要关于更好的正则表达式语法的提示。
最终数据框
Flop Suitedness
As 5d 7c Rainbow
As 9s 3s Monotone
8c 7d 5s Rainbow
Qs Ts 8d Double Suited
7s 2s 2d Double Suited
解决方案
- 使用您的样本数据
- 此解决方案不会更改正在使用的正则表达式,它只会简化
'Suitedness'
每个字符串的设置'Flop'
- 请参阅SO:Regex Tag Wiki以获取使正则表达式更高效的想法
- 访问regex101以测试您的正则表达式。
- 使用您的正则表达式和相关短语创建字典
- 将pandas.Series.apply与列表推导一起使用,如果不匹配,则返回具有正确列表
Suitedness
或空列表的列表re.match
。- 期望只有一个匹配或没有匹配,pandas.Series.explode用于返回索引 0 处的值。
- 列表索引选择不适用于列表为空的情况(例如
[][0]
),因为它会导致IndexError
- 列表索引选择不适用于列表为空的情况(例如
- 期望只有一个匹配或没有匹配,pandas.Series.explode用于返回索引 0 处的值。
- 如果您不关心
NaN
值,请使用df = df.dropna()
删除这些行。
import pandas as pd
import re
# create a dict of mappings
mapping = {'(\ws\s){2}\ws': 'Monotone',
'(\wc\s.*)+|(\w.\s\wc.*)+|(\w[s,d,c]\s\w[s,d,c]\s\wc)+': 'Rainbow',
'((\ws\s){2}\w[d,c])+|(\ws\s\w[d,c]\s\ws)+|(\w[d,c]\s\ws\s\ws)+': 'Double Suited'}
# apply a list comprehension
df['Suitedness'] = df.Flop.apply(lambda x: [v for k, v in mapping.items() if re.match(k, x)]).explode()
# display(df)
Flop Suitedness
As 5d 7c Rainbow
As 9s 3s Monotone
8c 7d 5s Rainbow
8d, As, Js NaN
Qs Ts 8d Double Suited
7s 2s 2d Double Suited
推荐阅读
- root - adb 和 fastboot 错误:远程:刷 twrp.img 时分区表不存在
- javascript - 如何在高级 PDF(HTML)中证明阿拉伯文本的合理性?
- java - 网址输入流未显示
- javascript - 将道具传递给 makeStyles 并在 Material UI 中的 CSS 速记属性中使用
- perl - PSGI 脚本中的“Cronjob”
- sql - 正则表达式黑名单
- android - FileOutputStream 从外部存储但在内部存储中读取时权限被拒绝
- flutter - 扑。TextField 检测外部点击的一种方法
- python - 如何检查列表元素?
- python - 如何在pyqt中播放视频