首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对数据集的所有行应用regex?

如何对数据集的所有行应用regex?
EN

Stack Overflow用户
提问于 2020-10-10 20:43:23
回答 2查看 313关注 0票数 5

我有如下数据集:

代码语言:javascript
复制
    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组“的位置。

因此,输出的一个例子可以是:

代码语言:javascript
复制
           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)]

我目前的解决办法是:

代码语言:javascript
复制
def split_it(mystring):
    x = re.findall('(S*)', mystring)
    if x :
      return(x)

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

这将导致以下输出:

代码语言:javascript
复制
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, , , , , , , , , , ]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-10 21:06:22

您可以使用

代码语言:javascript
复制
def split_it(mystring):
    return [(m.start(), m.end()) for m in re.finditer('S+', mystring)]

输出:

代码语言:javascript
复制
>>> 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字符,因此需要使用+来匹配一个或多个字符。

票数 7
EN

Stack Overflow用户

发布于 2020-10-10 21:14:18

您可以使用findall应用regex:

代码语言:javascript
复制
(
    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)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64298113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档