regex 在Pandas中使用正则表达式根据另一列中的字符串查找匹配项

new9mtju  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(72)

我有一个数据框,这是其中的一部分。

CodeID    Codes
0  'code1'   '[code1(a,b,c)][code2(c,d,e)][code3(e,f,g)]'   ...
1  'code2'   '[code1(a,b,c)][code2(c,d,e)][code3(e,f,g)]'   ...
2  'code3'   '[code1(a,b,c)][code2(c,d,e)][code3(e,f,g)]'   ...
...

我尝试做的是提取列Codes中与模式r"\[<code in CodeID column>[^][]*\]"匹配的字符串部分
比如:

df['Code'] = df['Codes'].str.find(r"\[<code in CodeID column>[^][]*\]")

This recent question似乎暗示这不可能以矢量化的方式实现,但情况并不完全相同。

lztngnrs

lztngnrs1#

我们当然可以使用一列中的字符串来比较另一列,如下所示:
在lambda表达式中,x[0]是codeID,x[1]是codes。

import re
import pandas as pd

Out[20]: 
    CodeID                                         Codes
0  'code1'  '[code1(a,b,c)][code2(c,d,e)][code3(e,f,g)]'
1  'code2'  '[code1(a,b,c)][code2(c,d,e)][code3(e,f,g)]'
2  'code3'  '[code1(a,b,c)][code2(c,d,e)][code3(e,f,g)]'

df[['CodeID','Codes']].apply(lambda x: re.match(r"\[%s[^][]*\]"%x[0], x[1]),axis=1)
Out[21]: 
0    None
1    None
2    None
dtype: object

它返回None,因为我的正则表达式技能不好:)

abithluo

abithluo2#

您可以使用pandas Series的extract方法和正则表达式,根据列CodeID中的相应值从列Codes中提取所需的字符串。下面是实现此功能的代码:

import pandas as pd

# Create a sample dataframe
df = pd.DataFrame({'CodeID': ['code1', 'code2', 'code3'],
                   'Codes': ['[code1(a,b,c)][code2(c,d,e)][code3(e,f,g)]',
                             '[code2(a,b,c)][code3(c,d,e)][code1(e,f,g)]',
                             '[code3(a,b,c)][code1(c,d,e)][code2(e,f,g)]']})

# Define a function to extract the matching pattern for each row
def extract_code(row):
    pattern = r"\[" + row['CodeID'] + r"[^][]*\]"
    match = row['Codes'].find(pattern)
    if match >= 0:
        return row['Codes'][match:row['Codes'].find(']', match)+1]
    else:
        return None

# Apply the function to each row to extract the code
df['Code'] = df.apply(extract_code, axis=1)

print(df)

输出:

CodeID                                        Codes           Code
0  code1  [code1(a,b,c)][code2(c,d,e)][code3(e,f,g)]  [code1(a,b,c)]
1  code2  [code2(a,b,c)][code3(c,d,e)][code1(e,f,g)]  [code2(a,b,c)]
2  code3  [code3(a,b,c)][code1(c,d,e)][code2(e,f,g)]  [code3(a,b,c)]

相关问题