如何按站点循环将公交时刻表Pandas DataFrame拆分为单趟行程子表
拆分公交行程DataFrame为单趟子表
核心思路
通过识别每趟行程的起始站点(示例中为"A"),为每行数据分配对应行程的分组编号,最终按分组拆分得到单趟行程的子DataFrame。
实现代码
import pandas as pd # 示例数据 df = pd.DataFrame({ "scheduled": ["2023-05-25 13:00", "2023-05-25 13:15", "2023-05-25 13:45", "2023-05-25 14:35", "2023-05-25 14:50", "2023-05-25 15:20"], "stop": ["A", "B", "C", "A", "B", "C"] }) df["scheduled"] = pd.to_datetime(df["scheduled"]) # 1. 标记每趟行程的起始行(以站点"A"作为行程起点) start_mask = df["stop"] == "A" # 2. 生成行程分组ID:每遇到一个起点,分组号递增 df["trip_id"] = start_mask.cumsum() # 3. 按trip_id拆分得到多个子DataFrame trip_dfs = [group for _, group in df.groupby("trip_id")] # 查看拆分结果 for i, trip_df in enumerate(trip_dfs, 1): print(f"第{i}趟行程:") print(trip_df.drop("trip_id", axis=1)) print("---")
代码解释
- 标记起始行:通过布尔掩码定位每趟行程的第一个站点,后续以此作为行程拆分的分界点。
- 生成分组ID:利用
cumsum()对布尔掩码累加(True计为1,False计为0),自动为同一趟行程的所有行分配相同的分组编号。 - 拆分DataFrame:通过
groupby按分组编号聚合,将每个聚合结果转换为独立的子DataFrame存入列表。
输出结果
第1趟行程: scheduled stop 0 2023-05-25 13:00:00 A 1 2023-05-25 13:15:00 B 2 2023-05-25 13:45:00 C --- 第2趟行程: scheduled stop 3 2023-05-25 14:35:00 A 4 2023-05-25 14:50:00 B 5 2023-05-25 15:20:00 C ---
扩展说明
如果你的行程起始站点不是"A",只需修改start_mask的判断条件即可。例如起始站为"总站",则改为df["stop"] == "总站"。
内容的提问来源于stack exchange,提问作者eliangius
相关产品推荐
相关产品推荐

