Python dict分组并对多个值求和

Aja*_*mar 5 python grouping dictionary sum pandas

我在 dict 格式列表中有一组数据,如下所示:

data = [
    {'name': 'A', 'tea':5, 'coffee':6},
    {'name': 'A', 'tea':2, 'coffee':3},
    {'name': 'B', 'tea':7, 'coffee':1},
    {'name': 'B', 'tea':9, 'coffee':4},
]
Run Code Online (Sandbox Code Playgroud)

我正在尝试按“名称”分组,并分别将“茶”和“咖啡”相加

最终分组的数据必须采用以下格式:

grouped_data = [
    {'name': 'A', 'tea':7, 'coffee':9},
    {'name': 'B', 'tea':16, 'coffee':5},
]
Run Code Online (Sandbox Code Playgroud)

我尝试了一些步骤:

from collections import Counter
c = Counter()
for v in data:
    c[v['name']] += v['tea']

my_data = [{'name': name, 'tea':tea} for name, tea in c.items()]
for e in my_data:
    print e
Run Code Online (Sandbox Code Playgroud)

上述步骤返回以下输出:

{'name': 'A', 'tea':7,}
{'name': 'B', 'tea':16}
Run Code Online (Sandbox Code Playgroud)

只有我可以总结关键的“茶”,我不能得到关键的“咖啡”的总和,你们能帮忙解决这个解决方案以获得 grouped_data 格式

cs9*_*s95 7

使用pandas

df = pd.DataFrame(data)
df

   coffee name  tea
0       6    A    5
1       3    A    2
2       1    B    7
3       4    B    9


g = df.groupby('name', as_index=False).sum()
g

  name  coffee  tea
0    A       9    7
1    B       5   16
Run Code Online (Sandbox Code Playgroud)

而且,最后一步,df.to_dict

d = g.to_dict('r')

d
[{'coffee': 9, 'name': 'A', 'tea': 7}, {'coffee': 5, 'name': 'B', 'tea': 16}]
Run Code Online (Sandbox Code Playgroud)