Pandas:基于日期筛选遍历DataFrame并实现加权求和计算
解决方案:基于Pandas实现日期范围筛选后的乘积求和
我来帮你搞定这个需求!下面是两种实用的实现方式,都基于Pandas库,你可以根据数据量大小选择合适的方法:
前提准备:确保日期列是datetime类型
首先要把df1的Date列,以及df2的mindate、maxdate列转换为datetime格式,否则日期比较会出错:
import pandas as pd # 转换df1的日期列 df1['Date'] = pd.to_datetime(df1['Date']) # 转换df2的日期列 df2[['mindate', 'maxdate']] = df2[['mindate', 'maxdate']].apply(pd.to_datetime)
方法一:逐行遍历(直观易懂,适合小数据量)
用apply函数逐行处理df2,每行中筛选出df1对应日期范围的Value,计算乘积后求和:
# 定义处理单一行的函数 def compute_row_total(row): # 构建日期范围筛选条件 date_mask = (df1['Date'] >= row['mindate']) & (df1['Date'] <= row['maxdate']) # 获取符合条件的Value filtered_values = df1.loc[date_mask, 'Value'] # 计算乘积之和并返回 return (filtered_values * row['value']).sum() # 给df2新增Total列,存储每行的计算结果 df2['Total'] = df2.apply(compute_row_total, axis=1)
这个方法逻辑直白,容易理解,但如果df2的行数很多(比如上万行),性能会稍差,这时候可以试试下面的高效方法。
方法二:合并+分组求和(性能更优,适合大数据量)
通过交叉合并、筛选、分组的方式,避免逐行遍历,提升处理速度:
# 给df2添加一个唯一标识列,用于后续分组 df2['row_id'] = df2.index # 交叉合并df1和df2,得到所有可能的行组合 merged_df = pd.merge(df1.assign(join_key=1), df2.assign(join_key=1), on='join_key').drop('join_key', axis=1) # 筛选出符合日期范围的行 valid_rows = merged_df[(merged_df['Date'] >= merged_df['mindate']) & (merged_df['Date'] <= merged_df['maxdate'])] # 按df2的行标识分组,计算每组的乘积之和 sum_results = valid_rows.groupby('row_id').apply( lambda group: (group['Value'] * group['value']).sum() ).reset_index(name='Total') # 将结果合并回原df2,并移除临时标识列 df2 = df2.merge(sum_results, on='row_id').drop('row_id', axis=1)
测试示例
假设你的df2示例数据如下:
df2 = pd.DataFrame({ 'mindate': ['2012-04-01', '2012-04-03'], 'maxdate': ['2012-04-02', '2012-04-05'], 'value': [100, 200] })
运行上述代码后,df2的Total列会得到:
- 第一行:
(0.00275 + 0.00278) * 100 = 0.553 - 第二行:
(0.00369 + 0.00268 + 0.004) * 200 = 2.074
内容的提问来源于stack exchange,提问作者D_Fresh
相关产品推荐
相关产品推荐

