使用更好的解决方案优化以下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}]}]