gpt4 book ai didi

python - 如何使用 python pandas 数据框找到正则表达式匹配的开始和结束?

转载 作者:行者123 更新时间:2023-11-28 18:40:38 25 4
gpt4 key购买 nike

我从数据库中获取 DNA 或蛋白质序列。序列是对齐的,所以虽然我总是知道一个输入序列,但它经常被截断并包含以添加的“-”字符形式出现的间隙。我首先想在查询字符串中找到一个区域。在这种情况下,正则表达式搜索非常有意义。然后我想从其他对齐的字符串中提取等效区域(我在这里将它们命名为“标记”和“命中”)。由于序列是对齐的,我想要的所有字符串中的区域将具有相同的开始和停止。有没有一种简单的方法来获取 Pandas 数据框中正则表达式匹配的开始和停止?

import pandas as pd
import re
q1,q2,q3 = 'MPIMGSSVYITVELAIAVLAILG','MPIMGSSVYITVELAIAVLAILG','MPI-MGSSVYITVELAIAVLAIL'
m1,m2,m3 = '|| || ||||||||||||||||','|| | ||| :|| || |:: |','||: ::|: :||||| |:: '
h1,h2,h3 = 'MPTMGFWVYITVELAIAVLAILG','MP-NSSLVYIGLELVIACLSVAG','MPLETQDALYVALELAIAALSVA'
#create a pandas dataframe to hold the aligned sequences
df = pd.DataFrame({'query':[q1,q2,q3],'markup':[m1,m2,m3],'hit':[h1,h2,h3]})
#create a regex search string to find the appropriate subset in the query sequence,
desired_region_from_query = 'PIMGSS'
regex_desired_region_from_query = '(P-*I-*M-*G-*S-*S-*)'

Pandas 有一个很好的提取功能,可以从查询中切出匹配的序列:

df['query'].str.extract(regex_desired_region_from_query)

但是我需要匹配的开始和结束,以便从标记和命中列中提取等效区域。对于单个字符串,这是按如下方式完成的:

match = re.search(regex_desired_region_from_query, df.loc[2,'query'])
sliced_hit = df.loc[2,'hit'][match.start():match.end()]
sliced_hit
Out[3]:'PLETQDA'

我目前的解决方法如下。 (编辑以包含 nhahtdh 的建议,因此避免搜索两次。)

#define function to obtain regex output (start, stop, etc) as a tuple
def get_regex_output(x):
m = re.search(regex_desired_region_from_query, x)
return (m.start(), m.end())
#apply function
df['regex_output_tuple'] = df['query'].apply(get_regex_output)
#convert the tuple into two separate columns
columns_from_regex_output = ['start','end']
for n, col in enumerate(columns_from_regex_output):
df[col] = df['regex_output_tuple'].apply(lambda x: x[n])
#delete the unnecessary column
df = df.drop('regex_output_tuple', axis=1)

现在我想使用获得的开始和结束整数来对字符串进行切片。这段代码会很好:
df.sliced = df.string[df.start:df.end]
但我认为它目前不存在。相反,我再次使用了 lambda 函数:

#create slice functions
fn_slice_hit = lambda x : x['hit'][x['start']:x['end']]
fn_slice_markup = lambda x : x['markup'][x['start']:x['end']]

#apply the slice functions
df['sliced_markup'] = df.apply(fn_slice_markup, axis = 1)
df['sliced_hit'] = df.apply(fn_slice_hit, axis = 1)
print(df)

hit markup query start end sliced_markup sliced_hit
0 MPTMGFWVYITVELAIAVLAILG || || |||||||||||||||| MPIMGSSVYITVELAIAVLAILG 1 7 | || PTMGFW
1 MP-NSSLVYIGLELVIACLSVAG || | ||| :|| || |:: | MPIMGSSVYITVELAIAVLAILG 1 7 | | P-NSSL
2 MPLETQDALYVALELAIAALSVA ||: ::|: :||||| |:: MPI-MGSSVYITVELAIAVLAIL 1 8 |: : PLETQDA

pandas .match、.extract、.findall 函数是否具有等同于 .start() 或 .end() 的属性?
有没有更优雅的切片方法?
如有任何帮助,我们将不胜感激!

最佳答案

我认为这在 pandas 中不存在,但会是一个很好的补充。转到 https://github.com/pydata/pandas/issues并添加一个新问题。说明这是您希望看到的增强功能。

对于 .start() 和 .end() 方法,将它们作为 extract() 方法的 kwargs 可能更有意义。如果 str.extract(pat, start_index=True),则返回起始索引的 Series 或 Dataframe,而不是捕获组的值。 end_index=True 也是如此。这些可能需要相互排斥。

我也喜欢你的建议

df.sliced = df.string[df.start:df.end]

Pandas 已经有一个 str.slice 方法

df.sliced = df.string.str.slice(1, -1)

但是那些必须是整数。在 Github 上添加一个单独的问题,让 str.slice 方法获取系列对象并按元素应用。

很抱歉没有比您的 lambda hack 更好的解决方案,但像这样的用例有助于插入 Pandas 变得更好。

关于python - 如何使用 python pandas 数据框找到正则表达式匹配的开始和结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26658213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com