Применение регулярного выражения к столбцу данных на основе значения в другом столбце - PullRequest
0 голосов
/ 20 марта 2020

У меня есть эта вспомогательная функция regex_fun c ниже, которая хорошо работала для извлечения совпадений из столбца df, используя map и lambda.

def regex_func(regex_compile,x,item=0,return_list=False):
    """Function to handle list returned by re.findall()
        Takes the first value of the list.
        If empty list, returns empty string"""
    match_list = regex_compile.findall(x)
    if return_list:
        match = match_list
    elif match_list:
        try:
            match = match_list[item]
        except:
             match = ""
    else:
        match = ""
    return match

#Working example
regex_1 = re.compile('(?i)(?<=\()[^ ()]+')
df['colB'] = df['colA'].map(lambda x: regex_func(regex_1, x))

У меня проблемы с выполнением аналогичной задачи. Я хочу, чтобы регулярное выражение основывалось на значении в другом столбце и затем применялось. Один метод, который я пробовал, который не сработал:

# Regex should be based on value in col1
# Extracting that value and prepping to input into my regex_func()
value_list = df['col1'].tolist()
value_list = ['(?i)(?<=' + d + ' )[^ ]+' for d in value_list]
value_list =  [re.compile(d) for d in value_list]
# Adding prepped list back into df as col2
df.insert(1,'col2',value_list)
#Trying to create col4, based on applying my re.compile in col 2 to a value in col3.
df.insert(2,'col4', df['col3'].map(lambda x: df['col2'],x)

Я понимаю, почему выше не работает, но не смог найти решение.

1 Ответ

1 голос
/ 23 марта 2020

Вы можете zip столбцы и затем построить регулярное выражение на лету:

df['colB'] = [regex_func('(?i)(?<=' + y + ' )[^ ]+', x)
              for x, y in zip(df['colA'], df['col1'])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...