You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:24:16