Pandas按分组统计非零值数量及求和并去重问题
解决Pandas分组统计非零值与求和并去重的问题
问题分析
你的代码存在两个核心问题:
- 直接将
groupby聚合结果赋值给原数据框列时,因索引不匹配导致大部分行返回NaN; 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
相关产品推荐
相关产品推荐

