使用Pandas移除行程数据中的冲突错误记录
解决行程冲突记录移除问题
步骤说明
- 先将时间字符串转换为Pandas可识别的
datetime类型,这是时间比较的基础。 - 按用户姓名分组,对每组内的行程按出发时间排序,确保按时间顺序检查行程。
- 遍历每组行程,标记出与已有行程重叠的冲突记录:如果当前行程的出发时间早于上一个保留行程的到达时间,说明行程冲突,需要移除。
- 最后过滤掉冲突记录,得到干净的数据集。
完整代码实现
import pandas as pd # 原始数据 df = pd.DataFrame({ "Name":["A","B","C","A"], "Dep_station":["Delhi","Bangalore","Chennai","Delhi"], "Arr_station":["Bangalore","Chennai","Delhi","Bangalore"], "Dep_time":["02-01-2022 10:00:00", "02-02-2022 10:00:00", "02-03-2022 10:00:00", "03-01-2022 10:00:00"], "Arr_time":["04-01-2022 22:00:00", "04-02-2022 19:00:00", "05-03-2022 18:00:00", "05-01-2022 22:00:00"] }) # 1. 转换时间列类型(匹配原始日-月-年格式) df['Dep_time'] = pd.to_datetime(df['Dep_time'], format='%d-%m-%Y %H:%M:%S') df['Arr_time'] = pd.to_datetime(df['Arr_time'], format='%d-%m-%Y %H:%M:%S') # 2. 按姓名分组,每组按出发时间排序 df_sorted = df.sort_values(['Name', 'Dep_time']).reset_index(drop=True) # 3. 标记冲突记录 def mark_conflicts(group): last_arr_time = pd.NaT group['is_conflict'] = False for idx, row in group.iterrows(): if pd.notna(last_arr_time) and row['Dep_time'] < last_arr_time: group.loc[idx, 'is_conflict'] = True else: last_arr_time = row['Arr_time'] return group # 应用冲突标记逻辑到每个用户组 df_with_conflicts = df_sorted.groupby('Name', group_keys=False).apply(mark_conflicts) # 4. 过滤冲突记录并删除辅助列 result_df = df_with_conflicts[~df_with_conflicts['is_conflict']].drop('is_conflict', axis=1) # 输出最终结果 print(result_df)
代码解释
- 时间转换:通过指定
%d-%m-%Y格式,确保Pandas正确解析原始数据中的日-月-年日期结构。 - 排序分组:按用户和出发时间排序,保证行程检查的时间顺序,避免漏判冲突。
- 冲突标记:遍历每个用户的行程,若当前行程出发时间早于上一个有效行程的到达时间,则标记为冲突;否则更新上一个有效行程的到达时间。
- 结果过滤:移除标记为冲突的行,并清理辅助标记列,得到无冲突的行程数据集。
输出结果
Name Dep_station Arr_station Dep_time Arr_time 0 A Delhi Bangalore 2022-01-02 10:00:00 2022-01-04 22:00:00 1 B Bangalore Chennai 2022-02-02 10:00:00 2022-02-04 19:00:00 2 C Chennai Delhi 2022-03-02 10:00:00 2022-03-05 18:00:00
内容的提问来源于stack exchange,提问作者sarath kumar
相关产品推荐
相关产品推荐

