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

Pandas按version分组,自定义函数计算overall分支X值

解决方案

方法一:自定义函数结合groupby.apply

逻辑直观,适合快速理解需求:

import pandas as pd
import numpy as np

# 构建示例DataFrame(已有数据可跳过此步骤)
df = pd.DataFrame(
    data=np.array(
        [
            [2475.0, 2475.0, 1712.5, 257.5, 392.5, 112.5, 2475.0, 2341.5, 95.0, 38.5, 2475.0, 2000.0, 475.0, 2475.0, 2341.5, 133.5],
            [-1, -1, 1, 2, 2, 3, -1, 1, 2, 2, -1, 1, 2, -1, 1, 1]
        ]
    ).T,
    index=pd.MultiIndex.from_tuples(
        tuples=[
            ('v0', 'overall'),
            ('v1', 'overall'),
            ('v1', 'A'),
            ('v1', 'B'),
            ('v1', 'C'),
            ('v1', 'D'),
            ('v2', 'overall'),
            ('v2', 'A'),
            ('v2', 'B'),
            ('v2', 'C'),
            ('v3', 'overall'),
            ('v3', 'A'),
            ('v3', 'B'),
            ('v4', 'overall'),
            ('v4', 'A'),
            ('v4', 'B'),
        ],
        names=['version', 'branch'],
    ),
    columns=['N', 'X'],
)

# 定义处理每个version分组的函数
def calculate_overall_x(group):
    # 筛选当前组中非overall的分支数据
    other_branches = group[group.index.get_level_values('branch') != 'overall']
    if other_branches.empty:
        # 组内仅含overall分支,返回1
        return 1.0
    # 计算加权和:非分支的N*X之和
    weighted_sum = (other_branches['N'] * other_branches['X']).sum()
    # 获取当前组overall分支的N值
    overall_n = group.loc[group.index.get_level_values('branch') == 'overall', 'N'].iloc[0]
    # 返回加权和除以overall的N值
    return weighted_sum / overall_n

# 计算每个version对应的overall新X值
overall_x_updates = df.groupby('version').apply(calculate_overall_x)

# 将新值赋值回原DataFrame
df.loc[pd.IndexSlice[:, 'overall'], 'X'] = overall_x_updates

# 查看结果
print(df)

方法二:高效向量式操作(适合大数据量)

避免逐组apply,通过分组聚合直接计算,性能更优:

# 计算每个version的非分支加权和
weighted_sums = df[df.index.get_level_values('branch') != 'overall'].groupby('version').apply(lambda g: (g['N'] * g['X']).sum())
# 获取每个version的overall分支N值
overall_ns = df[df.index.get_level_values('branch') == 'overall'].groupby('version')['N'].first()
# 计算新的X值,空值(仅含overall的version)填充为1
new_overall_x = weighted_sums.div(overall_ns).fillna(1.0)
# 赋值回原DataFrame
df.loc[pd.IndexSlice[:, 'overall'], 'X'] = new_overall_x

结果验证

运行后输出与预期完全匹配:

  • v0的overall X值为1(仅含overall分支)
  • v1的overall X值≈1.35353535354
  • v2的overall X值≈1.05393939394
  • v3的overall X值≈1.19191919192
  • v4的overall X值为1(加权和等于overall的N值)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:10:47