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

Pandas中Groupby分组计数返回NaN问题求解

解决DataFrame筛选与分组统计的NaN问题

让我一步步帮你修正代码里的问题,实现你想要的效果:

1. 先修正筛选pct=1.0记录的逻辑

你当前的代码df2 = df是把df2和原df绑定成同一个对象(不是复制),而且df2["pct"] = 1.0是把所有行的pct改成1.0,这完全不是筛选记录的逻辑。正确的做法是直接筛选出pct等于1.0的行,同时创建独立的DataFrame副本:

# 筛选pct=1.0的记录,生成独立副本避免影响原df
df2 = df[df['pct'] == 1.0].copy()

2. 正确新增分组统计的num_same列

你尝试的groupby.size()返回的是一个以visit_id为索引的Series,直接赋值给df2的列时,因为原df2的行索引和这个Series的索引不匹配,所以会出现NaN。这里有两种简单的解决方式:

方法一:用transform自动匹配行

transform('size')会返回和原DataFrame行数一致的结果,自动对应每个行所属分组的计数:

# 按visit_id分组,统计每组的记录数并映射到每一行
df2["num_same"] = df2.groupby("visit_id")["visit_id"].transform('size')

方法二:先统计再用map匹配

先计算每个visit_id的计数,再通过map把对应的值赋值到每一行:

# 先得到每个visit_id的记录数
visit_counts = df2.groupby("visit_id").size()
# 把每个行的visit_id对应到计数
df2["num_same"] = df2["visit_id"].map(visit_counts)

完整示例代码

把两步结合起来,最终代码如下:

# 假设你的原始DataFrame是df
# 第一步:筛选pct=1.0的记录
df2 = df[df['pct'] == 1.0].copy()

# 第二步:新增num_same列
df2["num_same"] = df2.groupby("visit_id")["visit_id"].transform('size')

运行后,df2的结果会是:

visitor label response products number  pct  num_same
1  def456  size    4 x 4        5      5  1.0         2
2  def456 shape    round        5      5  1.0         2

内容的提问来源于stack exchange,提问作者Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:49:16