如何高效过滤数据集并批量计算各起点的预算可达终点数?
高效计算每个起点在预算内的可达终点数量
当然有高效的方法!不用一个个手动处理每个起点,用pandas的分组(groupby)结合transform操作就能轻松搞定,而且完全适配大型数据集——毕竟pandas的这类操作底层是优化过的,比Python循环快得多。
核心思路
我们可以按origin分组,对每个组内的cost列统计满足cost <= 预算的行数(也就是可达终点的数量),再把这个统计结果广播到该组的每一行,这样就能新增一列展示每个起点对应的可达数量。
代码实现(统一预算场景)
假设你的数据集是用pandas DataFrame存储的,给定一个固定预算,代码如下:
import pandas as pd # 示例数据集(替换成你的真实数据) df = pd.DataFrame({ 'origin': ['A', 'A', 'A', 'B', 'B', 'B'], 'destination': ['X', 'Y', 'Z', 'X', 'Y', 'Z'], 'cost': [50, 150, 80, 90, 70, 120] }) # 设定你的预算值 target_budget = 100 # 新增可达终点数量列 df['reachable_destinations'] = df.groupby('origin')['cost'].transform( lambda group: (group <= target_budget).sum() ) # 查看结果 print(df)
这段代码会输出:
origin destination cost reachable_destinations 0 A X 50 2 1 A Y 150 2 2 A Z 80 2 3 B X 90 2 4 B Y 70 2 5 B Z 120 2
为什么这个方法高效?
- 避免了Python级别的循环:
groupby和transform都是pandas底层优化过的操作,用C扩展实现,处理百万级甚至更大的数据集速度远超手动遍历每个起点。 - 自动广播结果:
transform会把每个组的统计结果自动映射到该组的所有行,不需要手动合并数据。
进阶:每个起点有不同预算的场景
如果不同起点的预算不一样(比如有一个origin_budget字典),可以这样处理:
# 每个起点对应的预算 origin_budgets = {'A': 90, 'B': 110} # 先给每行匹配对应起点的预算 df['assigned_budget'] = df['origin'].map(origin_budgets) # 分组统计每个起点的可达数量 df['reachable_destinations'] = df.groupby('origin').apply( lambda g: (g['cost'] <= g['assigned_budget'].iloc[0]).sum() ).reindex(df['origin']).values
这种方法同样不需要手动循环每个起点,保证了处理大型数据集的效率。
内容的提问来源于stack exchange,提问作者Alice_inwonderland
相关产品推荐
相关产品推荐

