基于多列匹配的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)列会得到预期结果:
| X | Y | A( in days) | B(sum) |
|---|---|---|---|
| a | aa | 7 | 10.0 |
| a | bb | 9 | 12.0 |
| b | aa | 36 | 36.5714 |
| c | dd | 29 | 58.0 |
原代码错误原因
- 分组逻辑错误:你对df1分组取均值完全没必要(每个(X,Y)仅一行数据);对df2取
C的均值更是偏离需求——我们需要按周累加,而非把所有周的C值平均。 - 索引不匹配:
df2a['C']的索引是(X,Y)组合的MultiIndex,而你用df1a['A']的数值(如7、9)去索引它,自然会出现位置索引错误,因为索引是字符串组合而非数字。
内容的提问来源于stack exchange,提问作者One_more_time
相关产品推荐
相关产品推荐

