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

如何遍历DataFrame统计交通出行OD对的出行次数?

问题描述

现有一份城市交通流数据集,包含多段行程的区域序列,数据列包括TripID、Sequence、Zone,示例数据如下:

import pandas as pd
pd.DataFrame({
    'TripID': ['Tom', 'Tom', 'Tom', 'Krish', 'Krish'],
    'Sequence': [1, 2, 3, 1, 2],
    'Zone': ['A', 'B', 'C', 'A', 'B']
})

需求为统计各起点-终点(OD)区域对的出行次数,已通过以下代码生成包含所有可能区域对的OD矩阵:

# 假设OD是所有区域的集合,比如OD = ['A', 'B', 'C']
pairs = [(a, b) for a in OD for b in OD]
ODMatrix = pd.DataFrame(pairs, columns=['Origin', 'Dest'])

现需针对每个唯一TripID的行程序列,统计连续区域间的出行次数,并将结果填充至ODMatrix的trip_count列,最终输出格式示例如下:

pd.DataFrame({
    'Origin': ['A', 'B'],
    'Dest': ['B', 'C'],
    'trip_count': [2, 1]
})
解决方案

步骤1:生成每个行程的连续OD对

先按行程ID和序列排序保证顺序正确,再通过位移操作生成同行程内的连续起点-终点对:

# 按TripID和Sequence排序,确保序列逻辑正确
df_sorted = df.sort_values(by=['TripID', 'Sequence'])

# 对每个TripID,将Zone列向下位移一行作为后续区域(Dest)
df_sorted['Dest'] = df_sorted.groupby('TripID')['Zone'].shift(-1)
# 过滤无后续区域的行(每个行程的最后一条记录)
continuous_od = df_sorted.dropna(subset=['Dest']).rename(columns={'Zone': 'Origin'})

步骤2:统计各OD对的出行次数

对生成的连续OD对按起点、终点分组计数:

od_counts = continuous_od.groupby(['Origin', 'Dest']).size().reset_index(name='trip_count')

步骤3:合并到OD矩阵并填充结果

将统计结果与预生成的OD矩阵合并,空值填充为0(表示该OD对无出行记录):

# 合并OD矩阵和统计数据
ODMatrix = ODMatrix.merge(od_counts, on=['Origin', 'Dest'], how='left')
# 空值填充为0并转为整数类型
ODMatrix['trip_count'] = ODMatrix['trip_count'].fillna(0).astype(int)

# 若仅需展示有出行记录的OD对,可过滤掉计数为0的行
ODMatrix_filtered = ODMatrix[ODMatrix['trip_count'] > 0].reset_index(drop=True)

最终效果

以示例数据为例,ODMatrix_filtered将输出:

OriginDesttrip_count
AB2
BC1

内容的提问来源于stack exchange,提问作者Omkar Parishwad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:01:46