我有如下数据集:
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, , , , , , , , , , ]发布于 2020-10-10 21:06:22
您可以使用
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: objectre.finditer('S+', mystring)返回字符串中找到的所有匹配对象,您可以通过.start()和.end()调用获得开始和结束位置。
注意,输出中有空匹配,因为S*匹配零或多个S字符,因此需要使用+来匹配一个或多个字符。
发布于 2020-10-10 21:14:18
您可以使用findall应用regex:
(
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)]https://stackoverflow.com/questions/64298113
复制相似问题