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

Pandas按分组统计非零值数量及求和并去重问题

解决Pandas分组统计非零值与求和并去重的问题

问题分析

你的代码存在两个核心问题:

  1. 直接将groupby聚合结果赋值给原数据框列时,因索引不匹配导致大部分行返回NaN;
  2. count()方法统计的是非缺失值数量,而非你需要的非零值数量。

原数据框内完成操作的解决方案

使用transform方法将分组统计结果广播到原数据框的每一行,之后再去重:

import pandas as pd

d = {'ID': [156, 156, 156, 156, 157, 157, 157, 157],'PMN': [8.6, 8.4, 0, 10, 20, 0, 0, 5]}
df = pd.DataFrame(data=d)

# 统计每组PMN非零值数量,映射到原数据框
df['NodeDegree'] = df.groupby('ID')['PMN'].transform(lambda x: (x != 0).sum())
# 统计每组PMN求和,映射到原数据框
df['UpdateFlow'] = df.groupby('ID')['PMN'].transform('sum')

# 去除重复ID行,保留最后一行(可根据需求改为keep='first')
df.drop_duplicates(subset='ID', keep='last', inplace=True)

执行后结果:

ID  PMN  NodeDegree  UpdateFlow
3   156  10.0           3        27.0
7   157   5.0           2        25.0

更高效的直接聚合方案

如果不需要保留原数据框的多行记录,可直接通过agg方法聚合得到每个ID一行的结果:

agg_df = df.groupby('ID').agg(
    NodeDegree=('PMN', lambda x: (x != 0).sum()),
    UpdateFlow=('PMN', 'sum')
).reset_index()

执行后结果:

ID  NodeDegree  UpdateFlow
0  156           3        27.0
1  157           2        25.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:09:23