Подвижное назначение Python, основанное на совпадении с регулярным выражением - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь выяснить, как выполнить скользящее задание на основе соответствия регулярному выражению.У меня есть датафрейм ключей (keys_df) и фрейм новых данных, поступающих (new_df).Для каждого имени в new_df, если имя содержит любую из подстрок в столбце keys_df.contains, присвойте parent_id и parent_name этой новой записи.Если совпадений нет, оставьте значение NULL.

Из двух фреймов данных:

import pandas as pd

keys_df = pd.DataFrame([ ["steve"  , "2266", "Steve, Inc"], 
                    ["edward" , "3377", "Ed, Inc"],
                    ["Juan"   , "4488", "Juan, Inc"],
                    ["Pedro"  , "5599", "Pedro, Inc"]], 
                    columns=["contains", "parent_id", "parent_name"])

new_df = pd.DataFrame([ [ "9845" , "steve (bikes) qc", None,None],
            [ "9846" , "mark inc",None,None],
            [ "9847" , "young steve",None,None],
            [ "9845" , "Juan 22",None,None],
            [ "9845" , "Zak",None,None]],
            columns=["id", "name", "parent_name", "parent_id"])

Я бы хотел, чтобы вывод выглядел примерно так:

  id            name         parent_id    parent_name
"9845"  "steve (bikes) qc"      "2266"   "Steve, Inc" 
"9846"          "mark inc"       None          None
"9847"       "young steve"      "2266"   "Steve, Inc"
"9845"           "Juan 22"      "4488"    "Juan, Inc"
"9845"               "Zak"       None          None

Здесь также возникает вопрос эффективности.Выходной фрейм данных будет добавлен в таблицу SQLite.Так что если есть способ сделать это в SQLite поверх панд, это будет оценено.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 13 ноября 2018

Используя pandas str.extract с merge:

pat = '('+'|'.join(keys_df.contains)+')'
new_df['contains'] = new_df.name.str.extract(pat)
df = new_df.loc[:,['id','name','contains']].merge(keys_df,on='contains',how='left')
df.drop('contains',axis=1,inplace=True)

print(df)

     id              name parent_id parent_name
0  9845  steve (bikes) qc      2266  Steve, Inc
1  9846          mark inc       NaN         NaN
2  9847       young steve      2266  Steve, Inc
3  9845           Juan 22      4488   Juan, Inc
4  9845               Zak       NaN         NaN

Объяснение:

print(new_df.name.str.extract(pat))
       0
0  steve
1    NaN
2  steve
3   Juan
4    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...