Соответствие строки со списком регулярных выражений и добавление столбца, чтобы дать соответствующее значение, если соответствует Python - PullRequest
0 голосов
/ 10 апреля 2020

У меня проблемы с поиском совпадения строк в одном столбце df с другим df со списком регулярных выражений и его собственным типом регулярных выражений. Это регулярное выражение DF.

 **Country** |  **Regex**

     CN      |  ^\w{8,25}$
     BE      |  ^BE[0-9]{10}
     AT      |  ^ATU[0-9]{8}

Затем я хочу, чтобы значение в столбце «Данные» в другом файле df сканировалось и находило совпадения с помощью регулярного выражения df и возвращало собственный тип страны, в котором они нашли регулярное выражение. Это вывод, который я хочу (столбец Предложение). Это нужно, чтобы дать мне подсказку, какой тип страны соответствует регулярному выражению.

 **Data**   | **Suggestion**            **Data**   | **Suggestion** 

 BE135688   |              ---->        BE135688   |   BE   
 78567899   |                           78567899   |   CN
 AT5678899  |                           AT5678899  |   AT

Это то, что я пробовал,

df['Data'].str.match(df_regex.Regex)

Но я получил эту ошибку,

TypeError: ("'Series' objects are mutable, thus they cannot be hashed", 'occurred at index 271179')

Я знаю, что str.match может соответствовать только строковому типу. Но я не знаю, как заставить его сканировать все значения в столбце и вернуть собственный тип страны для соответствующего регулярного выражения. Есть ли лучший способ сделать это? Ценим помощь:)

1 Ответ

0 голосов
/ 11 апреля 2020

Один из вариантов: l oop для всех регулярных выражений и каждый раз, когда происходит совпадение, добавляйте соответствующую страну к предложениям. Вот пример *:

import pandas as pd
df_regex = pd.DataFrame({'Country': ['CN', 'BE', 'AT'],
             'Regex': ['^\w{8,25}$', '^BE[0-9]{10}', '^AT[0-9]{7}']})
df = pd.DataFrame({'Data': ['BE135688', '78567899', 'AT5678899']})
regex_map = dict(zip(df_regex.Regex, df_regex.Country))
def country_suggestions(row):
    matches = []
    for reg in regex_map:
        if re.search(reg, row):
            matches.append(regex_map[reg])
    return ', '.join(matches)

df['Suggestions'] = df['Data'].apply(country_suggestions)
print(df)

Это вывод:

        Data Suggestions
0   BE135688          CN
1   78567899          CN
2  AT5678899      CN, AT

* Обратите внимание, что я изменил регулярное выражение ^ATU[0-9]{8} на ^AT[0-9]{7}, поэтому оно фактически соответствует значение AT5678899. Это должно быть скорректировано соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...