Извлечение части текста из всех строк колонки по условию
Есть подобный датафрейм с множеством строк:
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'([^']*)")
Вообще похоже на 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

