使用更好的解决方案优化以下Python字典操作列表

使用更好的解决方案优化以下Python字典操作列表,python,pandas,Python,Pandas,嗨,我有一个字典列表: records = [ {"page":"A", "date":"2020-01-01", "value": 10, "metric":"engagement"}, {"page":"A", "date":"2020-01-01", "value": 5, "metric":"clicks"}, {"page":"B", "date":"2020-01-01", "value": 100, "met

嗨,我有一个字典列表:

records = [ 
            {"page":"A", "date":"2020-01-01", "value": 10, "metric":"engagement"},
            {"page":"A", "date":"2020-01-01", "value": 5, "metric":"clicks"},
            {"page":"B", "date":"2020-01-01", "value": 100, "metric":"engagement"},
            {"page":"B", "date":"2020-01-01", "value": 45, "metric":"clicks"},
            {"page":"A", "date":"2020-01-02", "value": 20, "metric":"engagement"},
            {"page":"A", "date":"2020-01-02", "value": 7, "metric":"clicks"},
          ]
我想要像这样的输出:

[
  { 
     "name": "A",
     "analytics": [
        {"date": "2020-01-01", "engagement":10, "clicks":5},
        {"date": "2020-01-02", "engagement":20, "clicks":7}
      ]
 },
 {
   "name": "B",
   "analytics": [
        {"date": "2020-01-01", "engagement":100, "clicks":45}
      ]
} ]
我目前的做法如下

    output = []
    page_result = OrderedDict({})
    date_result = OrderedDict({})
    for q in records:
        metric = q["metric"]
        date = q["date"]
        page = q["page"]
        if page not in page_result:
            page_result[page] = []

        if date not in date_result:
            date_result[date] = {}

        date_result[date][metric] = q["value"]
        date_result[date]["page"] = page

    for k,v in date_result.items():
        tmp = {"date":k}
        for k1,v1 in v.items():
            tmp[k1] = v1

        tmp.pop("page")
        page_result[v["page"]].append(tmp)


    for k, v in page_result.items():
        output.append({
                "name": k,
                "analytic": v
            })
我知道我的解决方案不好,这不是一个蟒蛇式的方法。我想这可以用理解或理解来压缩。 有人能提出更好的方法吗?
谢谢你

既然你标记了
熊猫
,这里有一种方法可以在
熊猫
中使用
groupby
pivot

df = pd.DataFrame(records)

result = [{"name":name, "analytics":(data.pivot(index="date",columns="metric",values="value")
                                    .reset_index().to_dict(orient="records"))}
          for name, data in df.groupby("page")]

print (result)

#
[{'name': 'A', 'analytics': [{'date': '2020-01-01', 'clicks': 5, 'engagement': 10},
                             {'date': '2020-01-02', 'clicks': 7, 'engagement': 20}]},
 {'name': 'B', 'analytics': [{'date': '2020-01-01', 'clicks': 45, 'engagement': 100}]}]

由于您标记了
pandas
,下面是使用
groupby
pivot
pandas
中执行此操作的一种方法:

df = pd.DataFrame(records)

result = [{"name":name, "analytics":(data.pivot(index="date",columns="metric",values="value")
                                    .reset_index().to_dict(orient="records"))}
          for name, data in df.groupby("page")]

print (result)

#
[{'name': 'A', 'analytics': [{'date': '2020-01-01', 'clicks': 5, 'engagement': 10},
                             {'date': '2020-01-02', 'clicks': 7, 'engagement': 20}]},
 {'name': 'B', 'analytics': [{'date': '2020-01-01', 'clicks': 45, 'engagement': 100}]}]