如何遍历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将输出:
| Origin | Dest | trip_count |
|---|---|---|
| A | B | 2 |
| B | C | 1 |
内容的提问来源于stack exchange,提问作者Omkar Parishwad
相关产品推荐
相关产品推荐

