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

基于ID从现有DataFrame生成含加权均值的汇总DataFrame

解决方案:按ID生成带加权平均U值的汇总DataFrame

我来帮你完善代码,实现你需要的建筑面积加权平均U值计算,同时保留现有的Surface汇总逻辑,完全匹配你的需求:

步骤说明

  1. 先过滤掉Surface为空的行,避免无效数据干扰计算
  2. 对每个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:52:44