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

如何将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单个点,现在我们来实现覆盖整个区间的效果,给你两种实用方案:

方法一:遍历区间累加(直观易懂)

这种方式逻辑清晰,适合数据量不大的场景:

  1. 先创建包含0到16所有月份的目标现金流DataFrame:
df_CF = pd.DataFrame({'Months': range(0, 17), 'Values': 0.0})
  1. 遍历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']
  1. 重命名列并查看结果:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:55