【问题标题】:Merge two lists of dictionaries by params in Python在 Python 中按参数合并两个字典列表
【发布时间】:2019-06-25 10:27:49
【问题描述】:

我有 2 个包含展示数据和点击数据的字典列表。例如:

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

[{'offerId': '3207', '位置': '9', 'impressionsCount': 866}, {'offerId':'1650','位置':'6','impressionsCount':896}, {'offerId':'3207','位置':'1','impressionsCount':909}, {'offerId': '2323', '位置': '12'}]...

我需要将其合并在一起,并按 offerId 和 position 来获得每个 offer 位置的结果(点击次数和展示次数)。

制作这样的东西

我试过这段代码,但它返回了错误的结果:

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))

有人可以帮我实现表格中的结果(屏幕截图)吗?

【问题讨论】:

  • 如果数据不完整或为图片,我们无法重新创建。你能更新吗?
  • 为什么要重复offerid?你如何结合点击和表达,该表没有多大帮助,如果你能提供更清晰的输出和解释而不是我们做猜测会更好
  • 如果您使用的是 pandas,您可以转换为数据框,然后合并 pd.DataFrame(d1).merge(pd.DataFrame(d2), on=['offerId', 'position'])
  • 听起来您只是想将其放入数据框中然后订购?技术上只是附加数据
  • offerId 重复,因为优惠卡可以显示在不同的位置我需要了解每个位置上每个优惠的展示次数以及点击次数

标签: python python-3.x list dictionary aggregate


【解决方案1】:

您可以尝试从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)

【讨论】:

    【解决方案2】:

    我希望这是您想要做的。使用两个字典创建pandas dataframe,然后找到clicksimpressions 的总和。请参阅下面的模型。让我知道它是否有效。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      相关资源
      最近更新 更多