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

基于多列匹配的Pandas DataFrame累计求和实现问题

解决方案

步骤1:预处理数据

首先清理并格式化df2,确保周数可排序,且每周的C值为该周总和:

import pandas as pd

# 构造示例df1(替换为你的实际数据)
df1 = pd.DataFrame({
    'X': ['a', 'a', 'b', 'c'],
    'Y': ['aa', 'bb', 'aa', 'dd'],
    'A( in days)': [7, 9, 36, 29],
    'B(sum)': [None, None, None, None]
})

# 构造示例df2(替换为你的实际数据)
df2 = pd.DataFrame({
    'X': ['a','a','a','a','a','','','a','a','a','','','b','b','b','b','b','b','b','b','','','c','c','c','c','c','c'],
    'Y': ['aa','aa','aa','aa','aa','','','bb','bb','bb','','','aa','aa','aa','aa','aa','aa','aa','aa','','','dd','dd','dd','dd','dd','dd'],
    'Week': ['WK1','WK2','WK3','WK4','Wk5','','','WK1','WK2','WK3','','','WK1','WK2','WK3','WK4','Wk5','Wk6','Wk7','WK8','','','WK1','WK2','WK3','WK4','WK5','WK4'],
    'C(weekly)': [10,23,21,2,5,'','',10,7,14,'','',10,5,4,8,7,18,3,7,'','',10,5,7,14,7,21]
})

# 清理df2的空行
df2 = df2.dropna(subset=['X', 'Y', 'Week']).reset_index(drop=True)

# 提取周数数字,统一转为整数(忽略WK/Wk大小写)
df2['week_num'] = df2['Week'].str.extract(r'(\d+)').astype(int)

# 按X、Y、周数分组,计算每周的C总和(处理同一周多次出现的情况)
df2_clean = df2.groupby(['X', 'Y', 'week_num'])['C(weekly)'].sum().reset_index()

# 按X、Y、周数排序,确保周顺序正确
df2_clean = df2_clean.sort_values(['X', 'Y', 'week_num']).reset_index(drop=True)

步骤2:编写计算函数

写一个函数,根据X、Y和天数A,从清理后的df2_clean中计算累计和:

def calculate_b(x, y, days):
    # 筛选当前X、Y对应的所有周数据,按周数排序
    group_data = df2_clean[(df2_clean['X'] == x) & (df2_clean['Y'] == y)].sort_values('week_num')
    c_values = group_data['C(weekly)'].tolist()
    if not c_values:
        return 0  # 无匹配数据时返回0,可按需调整
    
    full_weeks = days // 7
    remaining_days = days % 7
    
    # 计算整周总和
    total = sum(c_values[:full_weeks])
    
    # 计算剩余天数对应的部分周值
    if remaining_days > 0 and full_weeks < len(c_values):
        total += (remaining_days / 7) * c_values[full_weeks]
    
    return total

步骤3:填充df1的B列

用apply函数逐行计算并填充:

df1['B(sum)'] = df1.apply(lambda row: calculate_b(row['X'], row['Y'], row['A( in days)']), axis=1)

结果验证

运行后df1的B(sum)列会得到预期结果:

XYA( in days)B(sum)
aaa710.0
abb912.0
baa3636.5714
cdd2958.0

原代码错误原因

  1. 分组逻辑错误:你对df1分组取均值完全没必要(每个(X,Y)仅一行数据);对df2取C的均值更是偏离需求——我们需要按周累加,而非把所有周的C值平均。
  2. 索引不匹配:df2a['C']的索引是(X,Y)组合的MultiIndex,而你用df1a['A']的数值(如7、9)去索引它,自然会出现位置索引错误,因为索引是字符串组合而非数字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:34:56