Python, pandas Как разбить строку, найдя определенное слово, а не "," или "_" и т. Д. - PullRequest
4 голосов
/ 24 сентября 2019

Я с трудом пытаюсь извлечь номер идентификатора из строки.

Я мог бы получить его, используя индекс, но он потерпит неудачу для других строк фрейма данных.

Как извлечь campaignid=351154190, таким образом, чтобы он работал для всех строк.

Единственным шаблоном является слово campaignid, которое необходимо извлечь и сохранить в новом столбце во фрейме данных.Производительность не имеет решающего значения в этой задаче.

Исходная строка

https:_utm_source=googlebrand&utm_medium=ppc&utm_campaign=brand&utm_campaignid=3
51154190&keyword=aihdisadjiajdutm_matchtype=e&device=m&utm_network=g&utm_adposit
ion=1t1&geo=9027258&gclid=CjwKCsadjjsaopdl[psdklksfdosjfidj9FOk033DKW1xoCXlwQAvD
_BwE&affiliate_id=asdaskdosjadiasjdisaj-asdhasuigdyusagdyusagyk033DKW1xoCXlwQAvD_BwE&utm_content=search&utm_contentid=1251489456158180&placement&extension

Разделение строки

x= cw.captureurl.str.split('&').str[:-1]

печать одной строки

print(x[25])

['https:_utm_source=googlebrand', 'utm_medium=ppc', 'utm_campaign=brand', 
'utm_campaignid=35119190', 'keyword=columbia%20university%20online',
 'utm_matchtype=e', 'device=m', 'utm_network=g', 'utm_adposition=1t1',
 'geo=9027258', 'gclid=CjwKCAjwnMTqBRAzEiwAEF3ndo3-
CNOsp1VT5OIxm0BuUcSWQEwtJSR5KLiJzrvjjc9FOk033DKW1xoCXlwQAvD_BwE',
 'affiliate_id=CjwKCAjwnMTqBRAzEiwAEF3ndo3-
CNOsp1VT5OIxm0BuUcSWQEwtJSR5KLiJzrvjjc9FOk033DKW1xoCXlwQAvD_BwE', 
'utm_content=search', 'utm_contentid=1211732930', 'placement']

Было бы замечательно, если бы я мог использовать что-то, что искало бы слово «кампания» (какова моя цель)

Затем сохраните его в другом столбценекоторого фрейма данных.

Я пытался выполнить разбиение после разбиения, оно не работало, я пытался использовать цикл for с оператором if, тоже не работало.

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Я бы порекомендовал использовать urllib.В частности, функция parse_qs получит словарь строковых аргументов.https://docs.python.org/3/library/urllib.parse.html

Используя ваш пример URL, мы получаем:

from urllib.parse import parse_qs

test = 'https:_utm_source=googlebrand&utm_medium=ppc&utm_campaign=brand&utm_campaignid=351154190&keyword=aihdisadjiajdutm_matchtype=e&device=m&utm_network=g&utm_adposition=1t1&geo=9027258&gclid=CjwKCsadjjsaopdl[psdklksfdosjfidj9FOk033DKW1xoCXlwQAvD_BwE&affiliate_id=asdaskdosjadiasjdisaj-asdhasuigdyusagdyusagyk033DKW1xoCXlwQAvD_BwE&utm_content=search&utm_contentid=1251489456158180&placement&extension'

print(parse_qs(test))
{'https:_utm_source': ['googlebrand'],
 'utm_medium': ['ppc'],
 'utm_campaign': ['brand'],
 'utm_campaignid': ['351154190'],
 'keyword': ['aihdisadjiajdutm_matchtype=e'],
 'device': ['m'],
 'utm_network': ['g'],
 'utm_adposition': ['1t1'],
 'geo': ['9027258'],
 'gclid': ['CjwKCsadjjsaopdl[psdklksfdosjfidj9FOk033DKW1xoCXlwQAvD_BwE'],
 'affiliate_id': ['asdaskdosjadiasjdisaj-asdhasuigdyusagdyusagyk033DKW1xoCXlwQAvD_BwE'],
 'utm_content': ['search'],
 'utm_contentid': ['1251489456158180']}

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

# After parsing each url's arguments, we extract the first campaignid from the dictionary's list.
df['utm_campaignid'] = df['url'].apply(lambda x: parse_qs(x)['utm_campaignid'][0])
df.head()
    url utm_campaignid
0   https:_utm_source=googlebrand&utm_medium=ppc&u...   351154190
1 голос
/ 24 сентября 2019

Используйте регулярное выражение:

campaign_id = cw['captureurl'].str.extract('campaignid=(\\d+)')[0]
...