基于ID从现有DataFrame生成含加权均值的汇总DataFrame
解决方案:按ID生成带加权平均U值的汇总DataFrame
我来帮你完善代码,实现你需要的建筑面积加权平均U值计算,同时保留现有的Surface汇总逻辑,完全匹配你的需求:
步骤说明
- 先过滤掉
Surface为空的行,避免无效数据干扰计算 - 对每个ID组做自定义聚合:
- Surface处理:如果组内所有面积值完全相同,直接保留单个值;否则求和
- 加权平均U值:通过
(面积×U值)的总和 ÷ 面积总和计算,实现建筑面积加权
完整代码
import pandas as pd import numpy as np # 初始化原始数据 data = pd.DataFrame({ "ID": [2,2,2,2,4,4,4,52,52,95,95,95,95,95], "Surface": [10,12,24,8,84,84,84,np.nan,96,8,6,12,30,12], "U-value": [1.0,1.0,0.5,1.0,0.8,0.8,0.8,0.2,1.0,2.0,2.0,2.0,1.0,1.5] }) # 第一步:过滤掉Surface为空的行,符合需求中"忽略建筑面积为空的行"的要求 clean_data = data.dropna(subset=["Surface"]) # 第二步:定义自定义聚合函数,实现特殊的Surface汇总和加权U值计算 def aggregate_group(group): # 处理Surface:组内所有值相同则保留单个值,否则求和 unique_surfaces = group["Surface"].unique() total_surface = unique_surfaces[0] if len(unique_surfaces) == 1 else group["Surface"].sum() # 计算建筑面积加权平均U值 weighted_sum = (group["Surface"] * group["U-value"]).sum() average_u = weighted_sum / group["Surface"].sum() # 返回聚合结果,U值保留三位小数和示例一致 return pd.Series({ "Surface": total_surface, "U-value": round(average_u, 3) }) # 第三步:分组应用聚合函数,生成汇总DataFrame summary_df = clean_data.groupby("ID").apply(aggregate_group).reset_index() # 查看结果 print(summary_df)
输出结果
ID Surface U-value 0 2 54.0 0.778 1 4 84.0 0.800 2 52 96.0 1.000 3 95 68.0 1.471
关键细节解释
- 空值过滤:使用
dropna(subset=["Surface"])直接移除面积为空的行,确保ID52只计算有效行的面积和U值 - Surface特殊处理:通过
unique()判断组内面积是否全部相同,完美解决录入错误导致的重复相同值情况(如ID4) - 加权U值计算:严格遵循建筑面积加权逻辑,权重为每行的面积,确保结果准确反映整体保温性能
内容的提问来源于stack exchange,提问作者Matthi9000
相关产品推荐
相关产品推荐

