Pandas如何将groupby分组求和结果赋值为原DataFrame新列
Pandas分组统计值回填原DataFrame实现方案
标准惯用写法
Pandas中处理「分组聚合后将结果回填到原表对应行」的场景,最简洁高效的惯用写法是使用groupby搭配transform方法,该方法会自动将聚合结果按原表索引对齐,无需额外做映射匹配。
注意:你问题中写的聚合语句存在列名错误,聚合计算的对象是表中已存在的
count列,而非还未生成的src_ip_count/dst_ip_count列。
完整实现代码如下:
import pandas as pd # 构造示例数据 df = pd.DataFrame({'src_ip':['192.168.1.1','192.168.1.2','192.168.1.3','192.168.1.2'], 'dst_ip':['192.168.1.12','192.168.1.12','192.168.1.99','192.168.1.99'], 'count':[10,20,5,1]}) # 分组计算并直接赋值新列 df['src_ip_count'] = df.groupby('src_ip')['count'].transform('sum') df['dst_ip_count'] = df.groupby('dst_ip')['count'].transform('sum')
运行后输出结果完全匹配预期:
src_ip dst_ip count src_ip_count dst_ip_count 0 192.168.1.1 192.168.1.12 10 10 30 1 192.168.1.2 192.168.1.12 20 21 30 2 192.168.1.3 192.168.1.99 5 5 6 3 192.168.1.2 192.168.1.99 1 21 6
原理解释
- 直接调用
df.groupby('src_ip')['count'].sum()返回的是长度等于分组数量的序列,索引为分组键(即IP地址),和原DataFrame长度不一致,无法直接赋值为新列 transform方法会对分组内的每一行返回对应的聚合结果,最终输出的序列长度和原DataFrame完全一致,天然和原表行对齐,是该场景下的官方推荐写法
可选替代写法(非首选)
如果你已经提前生成了分组聚合结果,也可以通过map映射的方式赋值,效果一致但代码冗余度更高,且遇到分组键为空值时容易产生意外空值:
# 提前生成聚合结果 src_ip_total = df.groupby('src_ip')['count'].sum() dst_ip_total = df.groupby('dst_ip')['count'].sum() # 按IP映射回原表 df['src_ip_count'] = df['src_ip'].map(src_ip_total) df['dst_ip_count'] = df['dst_ip'].map(dst_ip_total)
内容的提问来源于stack exchange,提问作者binary01
相关产品推荐
相关产品推荐

