我有一个字典列表,我需要在Python中聚合:
data = [{"startDate": 123, "endDate": 456, "campaignName": "abc", "campaignCfid": 789, "budgetImpressions": 10},
{"startDate": 123, "endDate": 456, "campaignName": "abc", "campaignCfid": 789, "budgetImpressions": 50},
{"startDate": 456, "endDate": 789, "campaignName": "def", "campaignCfid": 123, "budgetImpressions": 80}]
我希望根据budgetImpressions进行汇总。
所以最终的结果应该是:
data = [{"startDate": 123, "endDate": 456, "campaignName": "abc", "campaignCfid": 789, "budgetImpressions": 60},
{"startDate": 456, "endDate": 789, "campaignName": "def", "campaignCfid": 123, "budgetImpressions": 80}]
请注意,具有特定campaignName的每个条目都将始终具有相同的campaignCfid,startDate和endDate。
这可以在Python中完成吗?我尝试过使用itertools但没有取得多大成功。使用熊猫会更好吗?
答案 0 :(得分:4)
只是为了证明有时python完全可以做这种事情:
In [11]: from collections import Counter
from itertools import groupby
In [12]: data = [{"startDate": 123, "endDate": 456, "campaignName": "abc", "campaignCfid": 789, "budgetImpressions": 10}, {"startDate": 123, "endDate": 456, "campaignName": "abc", "campaignCfid": 789, "budgetImpressions": 50}, {"startDate": 456, "endDate": 789, "campaignName": "def", "campaignCfid": 123, "budgetImpressions": 80}]
In [13]: g = groupby(data, lambda x: x.pop('campaignName'))
In [14]: d = {}
for campaign, campaign_data in g:
c = Counter()
for row in campaign_data: c.update(row)
d[campaign] = c # if you want a dict rather than Counter, return dict(c) here
In [15]: d
Out[15]:
{'abc': Counter({'campaignCfid': 1578, 'endDate': 912, 'startDate': 246, 'budgetImpressions': 60}),
'def': Counter({'endDate': 789, 'startDate': 456, 'campaignCfid': 123, 'budgetImpressions': 80})}
如果你已经有了这个列表/ dicts的集合,将它推广到DataFrame真的没有意义,那么保持纯python通常会更便宜。
答案 1 :(得分:0)
是的,请使用熊猫。太棒了。您可以使用groupby
功能并按总和汇总,然后将输出转换为dicts列表(如果这正是您想要的那样)。
import pandas as pd
data = [{"startDate": 123, "endDate": 456, "campaignName": 'abc',
"campaignCfid": 789, "budgetImpressions": 10},
{"startDate": 123, "endDate": 456, "campaignName": 'abc',
"campaignCfid": 789, "budgetImpressions": 50},
{"startDate": 456, "endDate": 789, "campaignName": 'def',
"campaignCfid": 123, "budgetImpressions": 80}]
df = pd.DataFrame(data)
grouped = df.groupby(['startDate', 'endDate', 'campaignCfid',
'campaignName']).agg(sum)
print grouped.reset_index().to_dict('records')
打印:
[{'startDate': 123L, 'campaignCfid': 789L, 'endDate': 456L, 'budgetImpressions': 60L, 'campaignName': 'abc'}, {'startDate': 456L, 'campaignCfid': 123L, 'endDate': 789L, 'budgetImpressions': 80L, 'campaignName': 'def'}]