如何将DataFrame中Values按Time_0-Time_1区间分配至现金流DataFrame
解决DataFrame中Values列分配到时间区间的问题
先明确你的核心需求:把df_data里每行的Values,分配到df_CF中从Time_0到Time_1的所有对应月份行里,最终每个月份的数值是所有覆盖它的区间的Values之和。
先看你的原始数据:
import pandas as pd df_data = pd.DataFrame({'Time_0': [5, 5, 5], 'Time_1': [8, 10, 12], 'Values': [10.0, 15.0, 20.0]})
你之前的代码只能把Values映射到Time_1单个点,现在我们来实现覆盖整个区间的效果,给你两种实用方案:
方法一:遍历区间累加(直观易懂)
这种方式逻辑清晰,适合数据量不大的场景:
- 先创建包含0到16所有月份的目标现金流DataFrame:
df_CF = pd.DataFrame({'Months': range(0, 17), 'Values': 0.0})
- 遍历
df_data的每一行,给对应的月份区间累加Values:
for _, row in df_data.iterrows(): start_month = row['Time_0'] end_month = row['Time_1'] # 用布尔索引定位到[start_month, end_month]的所有行,累加当前行的Values df_CF.loc[(df_CF['Months'] >= start_month) & (df_CF['Months'] <= end_month), 'Values'] += row['Values']
- 重命名列并查看结果:
result = df_CF.rename(columns={'Months': 'Time'}) print(result)
输出结果完全匹配你的期望:
Time Values 0 0 0.0 1 1 0.0 2 2 0.0 3 3 0.0 4 4 0.0 5 5 45.0 6 6 45.0 7 7 45.0 8 8 45.0 9 9 35.0 10 10 35.0 11 11 20.0 12 12 20.0 13 13 0.0 14 14 0.0 15 15 0.0 16 16 0.0
方法二:矢量化实现(高效适合大数据)
如果你的数据量很大,遍历会拖慢速度,可以用矢量化运算替代循环,效率提升明显:
import numpy as np # 生成所有月份的数组 months = np.arange(0, 17) # 构造二维数组,标记每个月份是否在对应区间内 in_range = (months >= df_data['Time_0'].values[:, None]) & (months <= df_data['Time_1'].values[:, None]) # 矩阵运算计算每个月份的累计Values total_values = in_range.T @ df_data['Values'].values # 构造结果DataFrame result = pd.DataFrame({'Time': months, 'Values': total_values})
这个方法用矩阵运算替代循环,结果和第一种方法完全一致,但处理大数据时速度会快很多。
内容的提问来源于stack exchange,提问作者Jordi Yu
相关产品推荐
相关产品推荐

