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

使用Pandas为DataFrame添加累计区间值的实现问题

Pandas为DataFrame添加累计区间值的实现问题

看起来你遇到的核心问题是:原代码只处理了每个Point_A对应的直接下一个Point_B,没有生成所有起点到后续所有终点的组合,自然得不到你想要的全区间累计结果。我来给你两种可行的解决方案,分别适合不同场景:

方案一:基于链式结构的遍历法(直观易懂)

因为你的数据是明显的链式结构(每个Point_A的下一个节点就是它的Point_B),我们可以先把所有点按顺序提取出来,再生成所有合法的起点-终点对,最后逐个累加中间的Range值:

import pandas as pd

# 先构造你的示例数据(如果已有DataFrame可以跳过这步)
data = {
    'Point_A': [1001400, 1001402, 1001404, 1001406, 1001408, 1001410],
    'Point_B': [1001402, 1001404, 1001406, 1001408, 1001410, 1001412],
    'Range': [9.7, 20.2, 16.0, 21.7, 11.1, 15.6]
}
df = pd.DataFrame(data)

# 提取所有有序的点集合
all_points = pd.concat([df['Point_A'], df['Point_B']]).unique()
all_points = sorted(all_points)

# 生成所有合法的起点-终点对(终点必须在起点之后)
point_pairs = []
for i in range(len(all_points)):
    start_point = all_points[i]
    for j in range(i + 1, len(all_points)):
        end_point = all_points[j]
        point_pairs.append((start_point, end_point))

# 计算每个点对的累计Range
result_rows = []
for start, end in point_pairs:
    current_point = start
    total_range = 0.0
    # 沿着链式结构累加直到到达终点
    while current_point != end:
        # 获取当前点对应的行
        current_row = df[df['Point_A'] == current_point].iloc[0]
        total_range += current_row['Range']
        current_point = current_row['Point_B']
    result_rows.append({
        'Point_A': start,
        'Point_B': end,
        'Cumulative_Range': total_range
    })

# 转换为最终的DataFrame
cumulative_df = pd.DataFrame(result_rows)
print(cumulative_df)

方案二:前缀和优化法(高效适合大数据量)

如果你的数据集很大,遍历链式结构的效率会偏低,这时候可以用前缀和的思路来优化:先计算每个点相对于起始点的累计和,之后任意两点的区间和就是终点前缀和减去起点前缀和:

import pandas as pd

data = {
    'Point_A': [1001400, 1001402, 1001404, 1001406, 1001408, 1001410],
    'Point_B': [1001402, 1001404, 1001406, 1001408, 1001410, 1001412],
    'Range': [9.7, 20.2, 16.0, 21.7, 11.1, 15.6]
}
df = pd.DataFrame(data)

# 构建点与前缀和的映射
points_list = [df['Point_A'].iloc[0]]
prefix_sums_list = [0.0]  # 起始点的前缀和为0
current_total = 0.0

for _, row in df.iterrows():
    current_total += row['Range']
    points_list.append(row['Point_B'])
    prefix_sums_list.append(current_total)

# 生成所有点对并计算累计和
result_rows = []
for i in range(len(points_list)):
    start = points_list[i]
    start_sum = prefix_sums_list[i]
    for j in range(i + 1, len(points_list)):
        end = points_list[j]
        end_sum = prefix_sums_list[j]
        result_rows.append({
            'Point_A': start,
            'Point_B': end,
            'Cumulative_Range': end_sum - start_sum
        })

cumulative_df = pd.DataFrame(result_rows)
print(cumulative_df)

为什么你的原代码没生效?

你的循环只遍历了每个Point_A对应的直接下一个Point_B,没有去遍历该起点之后的所有后续终点,所以最终得到的结果和原数据结构一致,并没有生成所有可能的区间组合。

备注:内容来源于stack exchange,提问作者Chinmay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:17:56