如何在Pandas DataFrame的每行中获取值对的计数与求和结果
高效实现按分组添加聚合列的解决方案
针对你需要为Pandas DataFrame添加sum_for_category和count_for_category列的需求,使用groupby+transform是最优且最高效的方案,完全适配大规模数据集(70万行不在话下),同时保留原DataFrame的所有行结构。
最优实现代码
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({ "name":["john","jim","eric","jim","john","jim","jim","eric","eric","john"], "category":["a","b","c","b","a","b","c","c","a","c"], "amount":[100,200,13,23,40,2,43,92,83,1] }) # 添加sum_for_category列:按name+category分组后,对amount求和并广播到每一行 df["sum_for_category"] = df.groupby(["name", "category"])["amount"].transform("sum") # 添加count_for_category列:按name+category分组后,统计记录数并广播到每一行 df["count_for_category"] = df.groupby(["name", "category"])["amount"].transform("count") print(df)
输出结果(与你的期望完全一致)
name category amount sum_for_category count_for_category 0 john a 100 140 2 1 jim b 200 225 3 2 eric c 13 105 2 3 jim b 23 225 3 4 john a 40 140 2 5 jim b 2 225 3 6 jim c 43 43 1 7 eric c 92 105 2 8 eric a 83 83 1 9 john c 1 1 1
为什么这个方法比你的原实现高效?
你的原方案通过嵌套字典+apply逐行映射,存在两个核心问题:
- 逐行处理效率极低:
apply是Python层面的逐行循环,对于70万行的数据集,运行时间会非常长;而groupby+transform是Pandas底层优化的矢量操作,基于C语言实现,速度提升几个数量级。 - 冗余计算:你手动遍历所有unique的name和category,提前计算所有组合的sum/count,这会产生不必要的计算(比如某些name+category组合可能不存在),而
groupby只会处理实际存在的分组,更高效。
核心原理解释
groupby(["name", "category"]):将DataFrame按name和category的组合进行分组,每个组对应唯一的name+category配对。transform("sum"):对每个分组的amount列求和,然后将结果广播回原DataFrame的每一行,保持原索引和行数不变,完美满足你"不分组聚合、保留原行数"的需求。transform("count"):同理,统计每个分组的记录条数并广播到对应行。
内容的提问来源于stack exchange,提问作者radishapollo
相关产品推荐
相关产品推荐

