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
相关产品推荐
相关产品推荐

