使用dplyr处理数据集:按ID计算Main=0时Size*Distance的求和结果
分组筛选计算求和解决方案
原始数据集
ID Main Size Distance 1 1 2 0 1 0 3 1 1 0 4 2 2 1 5 0 2 0 6 2 2 0 7 3
需求说明
按ID分组,仅针对每组中Main为0的行,计算Size与Distance的乘积,再将这些乘积求和,最终生成包含ID和求和结果Result的数据集,预期结果如下:
ID Result 1 11 2 33
解决方案
方法1:使用R语言(dplyr包)
核心逻辑是先筛选Main=0的行,再按ID分组求和,通过na.rm=TRUE避免缺失值导致的NA/NaN:
library(dplyr) # 构造数据集 df <- data.frame( ID = c(1,1,1,2,2,2), Main = c(1,0,0,1,0,0), Size = c(2,3,4,5,6,7), Distance = c(0,1,2,0,2,3) ) # 计算求和结果 result <- df %>% filter(Main == 0) %>% group_by(ID) %>% summarise(Result = sum(Size * Distance, na.rm = TRUE)) print(result)
方法2:使用Python语言(pandas库)
先筛选符合条件的行,再计算乘积后分组求和,pandas默认忽略缺失值,也可显式指定skipna=True:
import pandas as pd # 构造数据集 df = pd.DataFrame({ 'ID': [1,1,1,2,2,2], 'Main': [1,0,0,1,0,0], 'Size': [2,3,4,5,6,7], 'Distance': [0,1,2,0,2,3] }) # 简洁写法 result = df[df['Main'] == 0].assign(Product=lambda x: x['Size'] * x['Distance'])\ .groupby('ID')['Product'].sum()\ .reset_index(name='Result') print(result)
你之前出现NA/NaN的原因大概率是未提前筛选Main=0的行,导致分组计算时包含了不符合条件的行或缺失值,提前筛选即可解决问题。
内容的提问来源于stack exchange,提问作者Teresa
相关产品推荐
相关产品推荐

