如何在Python中按多列分组对列表最后一列求和?
实现多列分组对最后一列求和的Python方案
当然可以用Python实现这个需求!针对这种多列分组、最后一列求和的场景,我给你分享两个实用的方案,分别适合不同的场景:
方法一:用标准库collections.defaultdict(无需额外安装依赖)
这个方法用Python自带的标准库就能搞定,原理清晰,适合小数据集或者不想引入第三方库的场景:
核心思路是:把除最后一列外的所有列作为分组的「键」(因为列表不能作为字典的键,所以转成元组),然后遍历原始数据,累加每个分组对应的最后一列数值。
from collections import defaultdict # 你的原始数据 data = [['Andrew', '1', '9'], ['Peter', '1', '10'], ['Andrew', '1', '8'], ['Peter', '1', '11'], ['Sam', '4', '9'], ['Andrew', '2', '2']] # 初始化一个默认值为0的字典,用来存每个分组的总和 result_dict = defaultdict(int) for item in data: # 取前n-1列作为分组键,转成元组(列表不可哈希,不能当字典键) group_key = tuple(item[:-1]) # 把最后一列转成整数,累加到对应分组的总和里 result_dict[group_key] += int(item[-1]) # 把字典转换成你需要的列表格式 final_result = [list(key) + [str(total)] for key, total in result_dict.items()] print(final_result) # 输出:[['Andrew', '1', '17'], ['Peter', '1', '21'], ['Sam', '4', '9'], ['Andrew', '2', '2']]
这个方法的好处是完全不需要额外安装库,而且逻辑一目了然,就算是新手也能快速理解。
方法二:用pandas(适合大规模数据或复杂数据处理)
如果你的数据量很大,或者需要做更复杂的分组聚合操作,用pandas会更高效、更简洁:
import pandas as pd # 你的原始数据 data = [['Andrew', '1', '9'], ['Peter', '1', '10'], ['Andrew', '1', '8'], ['Peter', '1', '11'], ['Sam', '4', '9'], ['Andrew', '2', '2']] # 把数据转换成DataFrame格式 df = pd.DataFrame(data, columns=['name', 'group_col', 'value']) # 把最后一列转成数值类型(否则会按字符串拼接,不是求和) df['value'] = df['value'].astype(int) # 按前两列分组,对最后一列求和,然后重置索引 grouped_df = df.groupby(['name', 'group_col'])['value'].sum().reset_index() # 转换成你需要的列表格式,如果需要把数值转回字符串,可以加.astype(str) final_result = grouped_df.values.tolist() # 或者转成带字符串的结果:final_result = grouped_df.astype(str).values.tolist() print(final_result) # 输出:[['Andrew', '1', 17], ['Andrew', '2', 2], ['Peter', '1', 21], ['Sam', '4', 9]]
pandas的优势在于处理大规模数据时性能远超纯Python循环,而且语法非常直观,后续如果要扩展其他聚合操作(比如求均值、计数)也非常方便。
额外提示
不管用哪种方法,都要注意:
- 最后一列必须转成数值类型(int/float)再求和,不然会变成字符串拼接(比如'9'+'8'会得到'98'而不是17)
- 分组的键必须是可哈希的类型(比如元组、字符串),所以要把列表形式的分组列转成元组(像方法一里那样)
内容的提问来源于stack exchange,提问作者Deepleeqe
相关产品推荐
相关产品推荐

