Извлечение части текста из всех строк колонки по условию

Есть подобный датафрейм с множеством строк:

import pandas as pd
import re 

df = pd.DataFrame({'a':[1,2,3],'b':["{'fbclid': 'IwAR295tUiGCljtUzVYpJ6BMKwmbhOsfWOZzqVdpE29BbIfD4KigCupWriGuo_aem_AZscUccOW47NMeS9RpcIrjMVd2SrITSWAKZyukg-o4f6YwRd8KoxYrFuzlZGElx3rVgGdpf4C_i_JcW8Eeha7VzI', 'initial_utm_medium': 'EMPTY', 'initial_referring_domain': 'm.facebook.com'}",
                                   "{'initial_utm_medium': 'REFERRAL', 'initial_referring_domain': 'EMPTY', 'initial_utm_content': 'EMPTY', 'initial_utm_campaign': 'EMPTY', 'initial_twclid': 'EMPTY', 'initial_gclid': 'EMPTY', 'initial_utm_source': 'EMPTY', 'initial_dclid': 'EMPTY', 'initial_wbraid': 'EMPTY', 'initial_fbclid': 'EMPTY'}",
                                   '{}']})

введите сюда описание изображения

Нужно из колонки b извлечь значение initial_utm_medium, то есть все, что в кавычках после 'initial_utm_medium': ,

то есть, например, для второй строки получить "REFERRAL" (повторяющийся один раз).

Пробовала так:

pattern = r"'initial_utm_medium'.\s*'(.+)\', "
df.b.str.extract(pattern)

Но на выходе получаю не совсем то, что нужно:

введите сюда описание изображения

Никак не могу понять, как стопнуть захват текста после первой запятой после условия, помогите разобраться, пожалуйста :)


Ответы (2 шт):

Автор решения: Алексей Р

Один из вариантов - не использовать регулярки, а преобразовать текст в словарь и забрать значение по ключу

df['extr'] = df.b.transform(eval).str['initial_utm_medium']

Для безопасного преобразования вместо eval можно использовать ast.literal_eval

С регуляркой:

df['extr'] = df.b.str.extract(r"'initial_utm_medium':\s'([^']*)")
→ Ссылка
Автор решения: CrazyElf

Вообще похоже на JSON, только кавычки неправильные. Если заменить кавычки, то парсится как JSON:

import pandas as pd
import json

df = pd.DataFrame({'a':[1,2,3],'b':["{'fbclid': 'IwAR295tUiGCljtUzVYpJ6BMKwmbhOsfWOZzqVdpE29BbIfD4KigCupWriGuo_aem_AZscUccOW47NMeS9RpcIrjMVd2SrITSWAKZyukg-o4f6YwRd8KoxYrFuzlZGElx3rVgGdpf4C_i_JcW8Eeha7VzI', 'initial_utm_medium': 'EMPTY', 'initial_referring_domain': 'm.facebook.com'}",
                                   "{'initial_utm_medium': 'REFERRAL', 'initial_referring_domain': 'EMPTY', 'initial_utm_content': 'EMPTY', 'initial_utm_campaign': 'EMPTY', 'initial_twclid': 'EMPTY', 'initial_gclid': 'EMPTY', 'initial_utm_source': 'EMPTY', 'initial_dclid': 'EMPTY', 'initial_wbraid': 'EMPTY', 'initial_fbclid': 'EMPTY'}",
                                   '{}']})

df['initial_utm_medium'] = df.b.apply(lambda x: json.loads(x.replace("'", '"')).get('initial_utm_medium'))
df

Вывод:

    a   b                                              initial_utm_medium
0   1   {'fbclid': 'IwAR295tUiGCljtUzVYpJ6BMKwmbhOsfWO...   EMPTY
1   2   {'initial_utm_medium': 'REFERRAL', 'initial_re...   REFERRAL
2   3   {}                                                  None
→ Ссылка