使用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
相关产品推荐
相关产品推荐

