【问题标题】:How to apply regex over all the rows of a dataset?如何对数据集的所有行应用正则表达式?
【发布时间】:2021-01-25 14:26:24
【问题描述】:

我有一个数据集如下:

    data = {"C1" : ['DDDSSDSSDS','SSDDDSSDDS', 
   'DDDDDDDDDD','SSSSSSSSSS','SSSSSSSDSS','DDDDDSDDDD','SDDDDDDDDD']}
    dt = pd.DataFrame(data)
    print(dt)

对于每个字符串,我想获取每个“不间断 S 组”的第一个元素和最后一个元素的位置。例如,对于第一行,我有 'DDDSSDSSDS'(如您所见,我有三组 S)和我的这个“S 组”最喜欢的输出类似于[(3,5),(6,8),(9-10)],它在第一行显示第一、第二和第三个“不间断 S 组”的位置。

所以输出的一个例子可以是:

           C1                         C2
0  DDDSSDSSDS       [(3, 5), (6, 8), (9-10)]
1  SSDDDSSDDS  [(0, 2), (5, 7), (9, 10)]
2  DDDDDDDDDD                         []
3  SSSSSSSSSS                  [(1, 11)]
4  SSSSSSSDSS          [(0, 7), (8, 10)]
5  DDDDDSDDDD                   [(5, 6)]
6  SDDDDDDDDD                   [(0, 1)]

我目前的解决方案是:

def split_it(mystring):
    x = re.findall('(S*)', mystring)
    if x :
      return(x)

dt['C2'] = dt['C1'].apply(split_it)
print(dt)

导致以下输出:

0  DDDSSDSSDS  [, , , SS, , SS, , S, ]
1  SSDDDSSDDS  [SS, , , , SS, , , S, ]
2  DDDDDDDDDD   [, , , , , , , , , , ]
3  SSSSSSSSSS           [SSSSSSSSSS, ]
4  SSSSSSSDSS        [SSSSSSS, , SS, ]
5  DDDDDSDDDD  [, , , , , S, , , , , ]
6  SDDDDDDDDD  [S, , , , , , , , , , ]

【问题讨论】:

  • 到目前为止您尝试过什么? Stack Overflow 不是代码编写服务。
  • 看看这篇文章可能有助于解决你的问题towardsdatascience.com/…
  • @Marat 那么,有什么更好的回答工具呢?

标签: python regex pandas


【解决方案1】:

你可以使用

def split_it(mystring):
    return [(m.start(), m.end()) for m in re.finditer('S+', mystring)]

输出:

>>> dt['C1'].apply(split_it)
0    [(3, 5), (6, 8), (9, 10)]
1    [(0, 2), (5, 7), (9, 10)]
2                           []
3                    [(0, 10)]
4            [(0, 7), (8, 10)]
5                     [(5, 6)]
6                     [(0, 1)]
Name: C1, dtype: object

re.finditer('S+', mystring) 返回在字符串中找到的所有匹配对象,您可以通过.start().end() 调用获得开始和结束位置。

请注意,您的输出中有空匹配项,因为 S* 匹配 零个或多个 S 字符,您需要使用 + 匹配 一个或多个 .

【讨论】:

    【解决方案2】:

    您可以使用 findall 应用正则表达式:

    (
        dt
        .assign(C2= lambda x: x['C1'].str.findall('S+'))
        .assign(C2= lambda x: x.apply(lambda s: [(s[0].find(item),s[0].find(item)+len(item)) for item in s[1]] ,axis=1))
    )
    
               C1                        C2
    0  DDDSSDSSDS  [(3, 5), (3, 5), (3, 4)]
    1  SSDDDSSDDS  [(0, 2), (0, 2), (0, 1)]
    2  DDDDDDDDDD                        []
    3  SSSSSSSSSS                 [(0, 10)]
    4  SSSSSSSDSS          [(0, 7), (0, 2)]
    5  DDDDDSDDDD                  [(5, 6)]
    6  SDDDDDDDDD                  [(0, 1)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 2018-09-24
      • 1970-01-01
      • 2016-04-29
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多