Соответствующее регулярное выражение в двух разных фреймах данных Python - PullRequest
0 голосов
/ 20 апреля 2020

У меня возникают проблемы с сопоставлением регулярных выражений в двух разных фреймах данных, связанных с его типом и уникальной страной. Вот пример для данных df и регулярного выражения df. Обратите внимание, что форма для этих двух данных отличается, потому что регулярное выражение df содержит только уникальное значение.

             **Data df**                                          **Regex df**

  **Country    Type      Data**                       **Country    Type       Regex**
      MY       ABC     MY1234567890                        MY       ABC    ^MY[0-9]{10}
      IT       ABC     IT1234567890                        IT       ABC    ^IT[0-9]{10}
      PL       PQR     PL123456                            PL       PQR    ^PL
      MY       XYZ     456792abc                           MY       XYZ    ^\w{6,10}$
      IT       ABC     MY45889976
      IT       ABC     IT567888976

Я попытался объединить их вместе и использовать лямбда-выражения для сопоставления. Ниже мой код,

df.merge(df_regex,left_on='Country',right_on="Country")
df['Data Quality'] = df.apply(lambda r:re.match(r['Regex'],r['Data']) and 1 or 0, axis=1)

Но он добавит еще одну строку для каждого типа и страны. Таким образом, будет много дублирования, которое неэффективно и отнимает много времени.

Есть ли какой-нибудь способ pythoni c для сопоставления данных с их страной и типом, но ссылка находится в другом кадре данных. без слияния тех 2 дф. Затем, если его соответствие его собственному регулярному выражению, он вернет 1, иначе 0.

1 Ответ

2 голосов
/ 20 апреля 2020

Чтобы избежать повторения на основе Type, мы должны включить Type также в условия присоединения. Теперь примените lambda

df2 = df.merge(df_regex, left_on=['Country', 'Type'],right_on=['Country', 'Type'])
df2['Data Quality'] = df2.apply(lambda r:re.match(r['Regex'],r['Data']) and 1 or 0, axis=1)
df2

Это даст вам следующий вывод.

Country Type          Data         Regex  Data Quality
0      MY  ABC  MY1234567890  ^MY[0-9]{10}             1
1      IT  ABC  IT1234567890  ^IT[0-9]{10}             1
2      IT  ABC    MY45889976  ^IT[0-9]{10}             0
3      IT  ABC   IT567888976  ^IT[0-9]{10}             0
4      PL  PQR      PL123456           ^PL             1
5      MY  XYZ     456792abc    ^\w{6,10}$             1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...