Python 在整个数据帧中分离复杂的字符串

Python 在整个数据帧中分离复杂的字符串,python,string,pandas,series,Python,String,Pandas,Series,我在数据集中有一个列,看起来像上面的。以第一行为例,我想留下的信息是一列包含955563,另一列包含G>C。我在这里找到了几个正则表达式,但没有找到一个能起作用的正则表达式。以下内容适用于您的示例: 0 NC_000001.10:g.955563G>C 1 NC_000001.10:g.955597G>T 2 NC_000001.10:g.955619G>C 3 NC_000001.10:g.957640C>T 4 NC_000001.10:

我在数据集中有一个列,看起来像上面的。以第一行为例,我想留下的信息是一列包含955563,另一列包含G>C。我在这里找到了几个正则表达式,但没有找到一个能起作用的正则表达式。

以下内容适用于您的示例:

0    NC_000001.10:g.955563G>C
1    NC_000001.10:g.955597G>T
2    NC_000001.10:g.955619G>C
3    NC_000001.10:g.957640C>T
4    NC_000001.10:g.976059C>T
5    NC_000003.11:g.37090470C>T
6    NC_000012.11:g.133256600G>A
7    NC_012920.1:m.15923A>G
如果最后一个“列”始终具有A>A结构,其中A是单个字母,则可以更具体地使用:

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

以下内容适用于您的示例:

0    NC_000001.10:g.955563G>C
1    NC_000001.10:g.955597G>T
2    NC_000001.10:g.955619G>C
3    NC_000001.10:g.957640C>T
4    NC_000001.10:g.976059C>T
5    NC_000003.11:g.37090470C>T
6    NC_000012.11:g.133256600G>A
7    NC_012920.1:m.15923A>G
如果最后一个“列”始终具有A>A结构,其中A是单个字母,则可以更具体地使用:

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
:.*.
查找
和任何字符(因为您的示例中既有“g”又有“m”)直到我们要捕获的区域之前的期间

第一组:
(\d+)
匹配一个或多个数字

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

:.*.
查找
和任何字符(因为您的示例中既有“g”又有“m”)直到我们要捕获的区域之前的期间

第一组:
(\d+)
匹配一个或多个数字


第二组:
(\w>\w)
匹配单词字符,后跟
和单词字符,这是一种没有正则表达式的方法。注意:此解决方案使用Python 3.6()中的


这是一种没有正则表达式的方法。注意:此解决方案使用Python 3.6()中的



它们总是这样吗?i、 e.字符串的任何部分不再或不再更短?如果是这样的话,你不需要正则表达式,你只需要使用它们的长度是不同的。请在你的例子中添加一行不同的长度。哪个组件的长度不同?我添加了两种方法,它们可以在第6/7行中变化。它们总是以这种格式吗?i、 e.字符串的任何部分不再或不再更短?如果是这样的话,你不需要正则表达式,你只需要使用它们的长度是不同的。请在你的例子中添加一行不同的长度。哪一个组件的长度不同?我在第6/7行中添加了两种不同的方式,这几乎可以实现,但第3列需要包含G>C、G>T等,而第2列严格来说是一个数字。对于上面的内容,只有对我以外的所有人的投票:)@Justin,现在看起来应该更好了:)这几乎可以实现,但是列'3'需要包含G>C、G>T等,而列2严格来说是一个数字。对于以上内容,只有对我的所有人进行向上投票:)@Justin,现在看起来应该更好了:)或者,它甚至值得将摘录锚定到字符串的末尾:
df[1].str.extract(“(\d+)(\w>\w)$”,expand=True)
@JonClements当然。用
[mg]
代替
\w
是另一种可能的改进。当然。。。但由于标准似乎与字符串末尾的A>A匹配,前面有一个或多个数字。。。结尾的锚定更好地描述了这一点,而不必担心字符是什么或数字前面有多少个字符,不管它们是出现在
后面还是其他什么地方,并排除了奇怪的输入与字符串末尾以外的某个地方的模式匹配的可能性。或者,甚至值得将提取锚定到字符串末尾:
df[1]。str.extract(“(\d+)(\w>\w)$”,expand=True)
@JonClements Sure。用
[mg]
代替
\w
是另一种可能的改进。当然。。。但由于标准似乎与字符串末尾的A>A匹配,前面有一个或多个数字。。。锚定到结尾更好地描述了这一点,而不必担心字符是什么或数字前面有多少个字符,不管它们是出现在
后面还是其他什么地方,并且避免了出现奇怪的输入以匹配字符串末尾以外的某个地方的模式的可能性。
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