如何使用正则表达式模式对列进行分类?

2024-06-16 11:02:53 发布

您现在位置:Python中文网/ 问答频道 /正文

  • 我的问题是如何根据另一个专栏的内容在新专栏中添加一些价值
  • 在我的具体例子中,我有一个dataframe,其中有一个名为'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个不同的数据帧,并将它们连接起来。
    • 这个解决方案是可行的,但并不美观
    • 我在寻找一种更清洁的解决方案
  • 同样,我的正则表达式语法有点混乱。
    • 这三个类别基于字母“s”、1、2或3
    • 我还想了解有关更好的正则表达式语法的提示

最终数据帧

     Flop     Suitedness
 As 5d 7c        Rainbow
 As 9s 3s       Monotone
 8c 7d 5s        Rainbow
 Qs Ts 8d  Double Suited
 7s 2s 2d  Double Suited

Tags: 数据dfwsas类别pdnats
1条回答
网友
1楼 · 发布于 2024-06-16 11:02:53
  • 使用示例数据
  • 此解决方案不会更改正在使用的正则表达式,它只简化了'Flop'中每个字符串的'Suitedness'设置
  • 用你的常用表达和相关短语创建一本词典
  • pandas.Series.apply与列表理解一起使用,这将返回一个具有正确Suitedness的列表,如果与^{}不匹配,则返回一个空列表。
    • 由于预期只有一个匹配项,或者没有匹配项,因此使用pandas.Series.explode返回索引0处的值。
      • 列表索引选择不适用于列表为空的情况(例如[][0]),因为它会导致IndexError
  • 如果您不关心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

相关问题 更多 >