Объединить два списка словарей по параметрам в Python - PullRequest
0 голосов
/ 25 июня 2019

У меня есть 2 списка словарей с данными о показах и кликах.Например:

[{'offerId': '1650', 'position': '15', 'clicksCount': 21}, {'offerId': '2323', 'position':'12', 'clicksCount': 14}, {'offerId': '2323', 'position': '14', 'clicksCount': 8}, {'offerId': '1621', 'position': '10',' clicksCount ': 7}] ...

[{' offerId ':' 3207 ',' position ':' 9 ',' impressionionsCount ': 866}, {' offerId ':' 1650',' position ':' 6 ',' impressionionsCount ': 896}, {' offerId ':' 3207 ',' position ':' 1 ',' impressionionsCount ': 909}, {' offerId ':' 2323 ','position': '12'}] ...

Мне нужно объединить его, а также по offerId и позиции, чтобы получить результаты (клики и показы) для каждой позиции предложения.

Чтобы сделать что-то подобное enter image description here

Я пробовал этот код, но он дал неправильные результаты:

d = defaultdict(dict)
for l in (clicks_aggregated_data, impressions_aggregated_data):
    for elem in l:
        d[elem['offerId']].update(elem)
        d[elem['position']].update(elem)
combined_data = list(d.values())


for model, group in groupby(combined_data, key=lambda x:x['offerId']):
    print(list(group))

Может ли кто-нибудь помочь мне достичь результатакак в таблице (скриншот)?

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Вы можете попробовать создать диктант поиска из impressions_aggregated_data и затем выполнить слияние.

Пример:

impressions_aggregated_data_lookup = {"{}_{}".format(i["offerId"], i["position"]) : i["impressionsCount"] for i in impressions_aggregated_data}

for i in clicks_aggregated_data:
    if "{}_{}".format(i["offerId"], i["position"]) in impressions_aggregated_data_lookup:
        i.update({"impressionsCount": impressions_aggregated_data_lookup["{}_{}".format(i["offerId"], i["position"])]})

pprint(clicks_aggregated_data)
0 голосов
/ 25 июня 2019

Я надеюсь, что это то, что вы хотите сделать.создать pandas dataframe с двумя диктовками, а затем найти сумму clicks и impressions.Смотрите макет ниже.Дайте мне знать, если это работает.

import pandas as pd

d1=[{'offerId': '1650', 'position': '15', 'clicksCount': 21}, 
 {'offerId': '2323', 'position': '12', 'clicksCount': 14}, 
 {'offerId': '2323', 'position': '14', 'clicksCount': 8}, 
 {'offerId': '1621', 'position': '10', 'clicksCount': 7}]

d2=[{'offerId': '3207', 'position': '9', 'impressionsCount': 866},
 {'offerId': '1650', 'position': '6', 'impressionsCount': 896}, 
 {'offerId': '3207', 'position': '1', 'impressionsCount': 909}, 
 {'offerId': '2323', 'position': '12'}]

combdf=df1.append([pd.DataFrame(d1), pd.DataFrame(d2)],sort=False)

combdf.groupby(['offerId', 'position']).sum()[["clicksCount", "impressionsCount"]].reset_index()

Результат ниже:

offerId position    clicksCount impressionsCount
0   1621    10  14.0    0.0
1   1650    15  42.0    0.0
2   1650    6   0.0 896.0
3   2323    12  28.0    0.0
4   2323    14  16.0    0.0
5   3207    1   0.0 909.0
6   3207    9   0.0 866.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...