Использование регулярного выражения для анализа значений из словарей и подсчета (Python) - PullRequest
1 голос
/ 19 июня 2020

У меня есть столбец в фрейме данных со столбцом url_product, который содержит список словарей, как показано ниже (показаны первые 4 строки в качестве примера). Каждый словарь содержит URL-адрес и продукт, связанный с этим URL-адресом.

df.url_product[0] 
[{'url': 'https://www.abcstore.com/product/11-abc-gift-card/',
  'product': 'giftcard, abcstore'},
 {'url': 'https://www.abcstore.com/product/10-skin-lotion/',
  'product': 'lotion'},
 {'url': 'https://www.abcstore.com/product/10414-moisturising-cream',
  'product': 'cream'},
 {'url': 'https://www.abcstore.com/blog/best-skincare-lotions/',
  'product': 'lotion'},
 {'url': 'https://www.abcstore.com/article/140-best-anti-aging-serum',
  'product': 'serum'}]

df.url_product[1] 
[{'url': 'https://www.abcstore.com/product/7-night-cream',
  'product': 'nightcream'},
 {'url': 'http://www.abcstore.com/product/149-smoothing-serum/',
  'product': 'serum'},
 {'url': 'https://www.abcstore.com/blog/rapid-reveal-face-peel',
  'product': 'facepeel'}]

df.url_product[2] 
[{'url': 'https://www.abcstore.com/product/25-night-infusion-cream',
  'product': 'infusioncream'},
 {'url': 'https://www.abcstore.com/product/144-bio-cellulose-mask',
  'product': 'cellulosemask, mask'},
 {'url': 'https://www.abcstore.com/',
  'product': 'bestseller, homepage'},
 {'url': 'https://www.abcstore.com/blog/essential-skincare-products/',
  'product': 'essential, blog'}]

df.url_product[3] 
[{'url': 'https://www.abcstore.com/blog/top-skincare-products-2020',
  'product': 'skincare, 2020'},
 {'url': 'http://www.abcstore.com/article/smoothing-serum/',
  'product': 'serum'}]

Для каждой из этих строк я хочу сделать следующее:

  1. Отфильтровать только словари, в которых URL-адрес содержит '/ product /', и проанализировать число, следующее за 'product /' (будет называть это product_id как простую ссылку). ожидаемый product_id словаря ниже = 11 {'url': 'https://www.abcstore.com/product/11-abc-gift-card/', 'product': 'giftcard, abcstore'}
  2. Для каждого словаря, в котором URL содержит «/ product /», также подсчитайте количество «продуктов». В примере ниже это количество будет 2 (подарочная карта, abcstore). {'url': 'https://www.abcstore.com/product/11-abc-gift-card/', 'product': 'giftcard, abcstore'}
  3. Для каждой строки верните product_id с наибольшим количеством и создайте новый столбец ('top_product_id') в кадре данных, чтобы показать это. Если ни один product_id не имеет наибольшего количества, оставьте поле пустым

Ожидаемый результат для первых 3-х трех строк после шагов выше

df.top_product_id

[0] '11'
[1] (blank)
[2] '114'
[3] (blank)

несколько пунктов для объяснения ожидаемого результата

Строка [0] - ожидайте 11, поскольку product_id 11 имеет счетчик 2 (подарочная карта, abcstore), а product_id 10 и 10414 имеют только по 1 каждому. URL-адреса блога и статьи будут пропущены, так как они не содержат '/ product /' в URL-адресе Строка [1] - ожидайте, что результат будет пустым, поскольку два URL-адреса продукта привязаны к 1 продукту каждый, и поскольку нет единого URL-адреса с наибольшим количеством, строка будет пустой. Строка [2] - ожидайте 114, так как product_id 114 имеет наибольшее количество 2 (целлюлозная маска, маска) Строка [3] - ожидайте, что результат будет пустым, так как нет URL-адресов продуктов.

Как мне создать новый столбец ('top_product_id') в фрейме данных с ожидаемым результатом?

1 Ответ

1 голос
/ 19 июня 2020

Вот один из возможных подходов:

def findID(data):
    df1 = pd.DataFrame(data)
    df1 = df1.assign(
        count=df1['product'].str.split(', ').str.len(),
        product_id=df1['url'].str.extract(r'.*/product/(\d+)', expand=False)
    ).dropna().drop_duplicates(subset=['count'], keep=False)

    if df1.empty:
        return '(Blank)'

    return df1.loc[df1['count'].idxmax(), 'product_id']


df['top_product_id'] = df['url_product'].apply(findID)

# print(df)
                                         url_product top_product_id
0  [{'url': 'https://www.abcstore.com/product/11-...             11
1  [{'url': 'https://www.abcstore.com/product/7-n...        (Blank)
2  [{'url': 'https://www.abcstore.com/product/25-...            144
3  [{'url': 'https://www.abcstore.com/blog/top-sk...        (Blank)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...