基于另一DataFrame列值的Pandas DataFrame行求和实现需求
解决Pandas按天数计算累计值的问题
首先我们先还原你提供的两个DataFrame:
import pandas as pd # 构建df1 df1 = pd.DataFrame({ 'A( in days)': [7, 14, 18, 25], 'B (sum)': [None, None, None, None] }) # 构建df2 df2 = pd.DataFrame({ 'week': ['WK1', 'WK2', 'WK3', 'WK4', 'WK5'], 'C(weekly)': [10, 5, 7, 4, 8] })
接下来我们一步步实现需求:
步骤1:预处理df2,提取周数序号并计算累计和
先从week列提取数字序号,同时计算C(weekly)的累计和,方便后续快速获取完整周的总和:
# 提取周数的数字部分,转为整数 df2['week_num'] = df2['week'].str.extract(r'WK(\d+)').astype(int) # 计算累计和,比如WK1的累计和是10,WK2是10+5=15,以此类推 df2['cumulative_sum'] = df2['C(weekly)'].cumsum()
处理后的df2会变成:
| week | C(weekly) | week_num | cumulative_sum |
|---|---|---|---|
| WK1 | 10 | 1 | 10 |
| WK2 | 5 | 2 | 15 |
| WK3 | 7 | 3 | 22 |
| WK4 | 4 | 4 | 26 |
| WK5 | 8 | 5 | 34 |
步骤2:定义计算B列的函数
我们写一个函数,输入天数,返回对应的B值:
def calculate_b(days): # 计算完整的周数:比如7天=1周,14天=2周,18天=2周(余4天) full_weeks = days // 7 # 计算剩余天数:如果刚好整周,剩余天数为0 remaining_days = days % 7 # 获取完整周的累计和:full_weeks=1对应WK1的累计和,取索引full_weeks-1的行 if full_weeks == 0: full_sum = 0 else: # 确保不超出df2的周数范围 if full_weeks > len(df2): full_sum = df2['cumulative_sum'].iloc[-1] else: full_sum = df2['cumulative_sum'].iloc[full_weeks - 1] # 计算剩余天数对应的部分值 partial_sum = 0 if remaining_days > 0: # 剩余天数对应的是第full_weeks+1周(比如full_weeks=2,对应WK3) target_week_idx = full_weeks # 同样要确保不超出范围 if target_week_idx < len(df2): weekly_value = df2['C(weekly)'].iloc[target_week_idx] partial_sum = weekly_value * (remaining_days / 7) # 总和就是完整周累计加剩余部分 return full_sum + partial_sum
步骤3:将函数应用到df1的A列,填充B列
用apply函数遍历df1的每一行,计算B值:
df1['B (sum)'] = df1['A( in days)'].apply(calculate_b)
运行后df1的结果:
| A( in days) | B (sum) |
|---|---|
| 7 | 10.0 |
| 14 | 15.0 |
| 18 | 19.0 |
| 25 | 24.2857 |
补充说明
- 函数里加入了超出df2周数范围的判断:如果输入的天数超过df2所有周的总天数(比如36天,df2只有5周=35天),会取df2的累计总和,不会报错。
- 代码里的注释尽量详细,方便新手理解每一步的逻辑。
内容的提问来源于stack exchange,提问作者One_more_time
相关产品推荐
相关产品推荐

