在整个数据帧中分离棘手的字符串

时间:2018-05-29 19:56:27

标签: python string pandas series

$route['login-resgistration'] = 'f/login/index';
$route['my-account'] = 'f/login/myaccount';
$route['(.*)'] = 'data/$1';

我在数据集中有一个如上所示的列。以第一行为例,我想留下的信息是一列包含955563,一列包含G> C.我已经玩了几个我在这里找到的正则表达式,但没有找到一个可以解决这个问题的正则表达式。

3 个答案:

答案 0 :(得分:3)

以下适用于您的示例:

df[0].str.extract(':\w\.(\d+)(.+)')
#           0    1
#0     955563  G>C
#1     955597  G>T
#2     955619  G>C
#3     957640  C>T
#4     976059  C>T
#5   37090470  C>T
#6  133256600  G>A
#7      15923  A>G

如果最后一个“列”始终具有A> A结构,其中A是单个字母,那么您可以更具体地使用:

df[0].str.extract(':\w\.(\d+)(\w>\w)')

答案 1 :(得分:1)

':.*\.(\d+)(\w>\w)'

:.*\.查找:和任何字符(因为您的示例同时包含'g'和'm'),直到我们想要捕获的区域之前的时间段。

第一组:(\d+)匹配1位或更多位数。

第二组:(\w>\w)匹配单词字符,后跟>,后跟单词字符

答案 2 :(得分:1)

这是没有正则表达式的一种方法。请注意,此解决方案使用Python 3.6(formatted string literals)中的PEP 498

def splitter(x):
    y = x.rsplit('.', maxsplit=1)[-1].split('>')
    return int(y[0][:-1]), f'{y[0][-1]}>{y[1]}'

df[['2', '3']] = df[1].apply(splitter).apply(pd.Series)

print(df)

   0                            1          2    3
0  0     NC_000001.10:g.955563G>C     955563  G>C
1  1     NC_000001.10:g.955597G>T     955597  G>T
2  2     NC_000001.10:g.955619G>C     955619  G>C
3  3     NC_000001.10:g.957640C>T     957640  C>T
4  4     NC_000001.10:g.976059C>T     976059  C>T
5  5   NC_000003.11:g.37090470C>T   37090470  C>T
6  6  NC_000012.11:g.133256600G>A  133256600  G>A
7  7       NC_012920.1:m.15923A>G      15923  A>G