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

如何用Groupby分组并为每行分配Series值?Pandas权重分配求助

问题描述

我有一个从CSV读取的DataFrame:

my_date    my_id  values  key   factor
     1/1/2024   _One    123    key1   .56
     1/7/2024   _One    567    key1   .75
     1/14/2024  _One    100    key1   .81
     1/14/2024  _One    100    key2   .44
     1/1/2024   _Two    150    key3   .91
     1/7/2024   _Two    130    key3   .88
     1/1/2024   _Three  200    key4    0
     1/1/2024   _Three  200    key5    .45

可见同一my_id下的多个key存在日期重叠情况。需要将DataFrame处理为如下形式:基于factor权重计算分配后的值,规则是:

  • 权重为重叠时段内factor除以该时段factor总和
  • 若总和为0则按行数均分

目标处理后DataFrame:

my_date    my_id   values  key   factor    weights allocated_values
     1/1/2024   _One    123     key1    0.56    1       123
     1/7/2024   _One    500     key1    0.75    1       500
     1/14/2024  _One    100     key1    0.81    0.648   64.8
     1/14/2024  _One    100     key2    0.44    0.352   35.2
     1/1/2024   _Two    160     key3    0.91    1       160
     1/7/2024   _Two    130     key3    0.88    1       130
     1/1/2024   _Three  200     key4    0      0.50     100
     1/1/2024   _Three  200     key5    0.45   0.50     100

我尝试了如下分组操作,但无法正常运行:

for name, group in my_df.groupby('my_id'):
    for name1, group1 in group.groupby('key'):
        factors = group1['factor']
        weight = factors['factor']/factors.sum() if factors.sum() != 0 | (factors==0).any() else 1/len(factors)
        # 尝试方法1
        group['weights'] = weight # 无效
        # 尝试方法2
        my_df['weights'] = my_df.update(group) # 无效
解决方案

核心问题是分组逻辑错误——需要按my_id和my_date分组(重叠场景是同一ID+同一日期下的多个key),而非先按ID再按key。另外循环修改DataFrame效率低且易出错,建议用groupby结合transform实现向量式计算,步骤如下:

  1. 定义权重计算函数
  2. 按my_id+my_date分组,应用函数计算权重
  3. 计算分配后的值

完整代码:

import pandas as pd

# 读取原始DataFrame(示例数据)
data = {
    'my_date': ['1/1/2024', '1/7/2024', '1/14/2024', '1/14/2024', 
                '1/1/2024', '1/7/2024', '1/1/2024', '1/1/2024'],
    'my_id': ['_One', '_One', '_One', '_One', '_Two', '_Two', '_Three', '_Three'],
    'values': [123, 567, 100, 100, 150, 130, 200, 200],
    'key': ['key1', 'key1', 'key1', 'key2', 'key3', 'key3', 'key4', 'key5'],
    'factor': [0.56, 0.75, 0.81, 0.44, 0.91, 0.88, 0, 0.45]
}
my_df = pd.DataFrame(data)

# 定义权重计算函数
def calculate_weights(group):
    factor_sum = group['factor'].sum()
    if factor_sum != 0:
        return group['factor'] / factor_sum
    else:
        return [1/len(group)] * len(group)

# 计算权重
my_df['weights'] = my_df.groupby(['my_id', 'my_date'])['factor'].transform(calculate_weights)

# 计算分配后的值
my_df['allocated_values'] = my_df['values'] * my_df['weights']

# 可选:保留小数位数对齐示例格式
my_df['weights'] = my_df['weights'].round(3)
my_df['allocated_values'] = my_df['allocated_values'].round(1)

print(my_df)

代码说明:

  • 分组逻辑:groupby(['my_id', 'my_date'])精准定位每个重叠时段(同一ID+同一日期的组)
  • transform函数:将分组计算结果映射回原DataFrame对应行,避免循环修改的问题
  • 权重规则:先判断组内factor总和是否为0,不为0则按比例分配,为0则均分
  • 分配值计算:用values * weights实现向量运算,效率远高于循环

运行后输出与目标格式一致的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:36:10