如何在字典列表中新增同name对应value总和的key?Pandas及Python实现
问题描述
给定如下字典列表:
[ {'name': 'a', 'age': '20', 'value': '10'}, {'name': 'a', 'age': '30', 'value': '15'}, {'name': 'a', 'age': '40', 'value': '25'}, {'name': 'b', 'age': '20', 'value': '11'}, {'name': 'b', 'age': '30', 'value': '12'}, {'name': 'b', 'age': '40', 'value': '13'} ]
需要为每个字典新增sum键,其值为相同name对应的所有value的总和,最终得到如下结果:
[ {'name': 'a', 'age': '20', 'value': '10', 'sum': '50'}, {'name': 'a', 'age': '30', 'value': '15', 'sum': '50'}, {'name': 'a', 'age': '40', 'value': '25', 'sum': '50'}, {'name': 'b', 'age': '20', 'value': '11', 'sum': '36'}, {'name': 'b', 'age': '30', 'value': '12', 'sum': '36'}, {'name': 'b', 'age': '40', 'value': '13', 'sum': '36'} ]
解决方案
Pandas实现方式
借助Pandas的分组聚合与合并功能可以快速实现需求,核心步骤如下:
- 将字典列表转为DataFrame,同时把
value字段从字符串转为数值类型(否则无法直接求和) - 按
name分组计算对应value的总和 - 将求和结果合并回原始DataFrame
- 把
sum字段转回字符串格式,再将DataFrame转为目标字典列表
示例代码:
import pandas as pd # 原始数据 data = [ {'name': 'a', 'age': '20', 'value': '10'}, {'name': 'a', 'age': '30', 'value': '15'}, {'name': 'a', 'age': '40', 'value': '25'}, {'name': 'b', 'age': '20', 'value': '11'}, {'name': 'b', 'age': '30', 'value': '12'}, {'name': 'b', 'age': '40', 'value': '13'} ] # 转为DataFrame并转换value类型 df = pd.DataFrame(data).astype({'value': int}) # 分组计算每个name的value总和 sum_df = df.groupby('name')['value'].sum().reset_index(name='sum') # 合并原始数据与总和数据 result_df = df.merge(sum_df, on='name') # 转换sum为字符串并转为字典列表 result = result_df.astype({'sum': str}).to_dict('records') print(result)
标准Python实现方式
无需依赖第三方库,通过两次遍历即可完成需求:
- 第一次遍历:统计每个
name对应的value总和 - 第二次遍历:为每个字典添加
sum键(注意复制原字典,避免修改原始数据)
示例代码:
data = [ {'name': 'a', 'age': '20', 'value': '10'}, {'name': 'a', 'age': '30', 'value': '15'}, {'name': 'a', 'age': '40', 'value': '25'}, {'name': 'b', 'age': '20', 'value': '11'}, {'name': 'b', 'age': '30', 'value': '12'}, {'name': 'b', 'age': '40', 'value': '13'} ] # 统计每个name的value总和 name_total = {} for item in data: name = item['name'] val = int(item['value']) name_total[name] = name_total.get(name, 0) + val # 为每个字典添加sum键 result = [] for item in data: new_item = item.copy() new_item['sum'] = str(name_total[item['name']]) result.append(new_item) print(result)
内容的提问来源于stack exchange,提问作者DrZoidberg09
相关产品推荐
相关产品推荐

