如何用Pandas仅移除连续重复行并基于其他列替换值
Pandas处理连续重复行:保留首行并替换为组内最后一行的Departure值
原始数据
import pandas as pd df = pd.DataFrame( [ ['China', '08/06/2022 20:00', '08/10/2022 20:00'], ['China', '8/13/2022 00:54', '8/14/2022 00:54'], ['China', '8/14/2022 00:54', '8/14/2022 12:54'], ['United Kingdom', '8/27/2022 06:36', '8/31/2022 21:08'], ['United Kingdom', '9/01/2022 21:08', '09/02/2022 21:38'], ['China', '09/04/2022 21:38', '09/06/2022 21:38'] ], columns=['Country', 'Arrival', 'Departure'] )
需求说明
仅移除连续重复的行(即同一Country连续出现的多行),保留每组连续重复行的第一行,并将其Departure值替换为该组最后一行的Departure值;非连续的重复行(如最后一行的China与前面的China不连续)需保留。
实现代码
# 生成连续分组的ID:标记每个连续相同Country的组 group_ids = df['Country'].ne(df['Country'].shift()).cumsum() # 按分组聚合,保留首行的Arrival,取最后一行的Departure result_df = df.groupby(group_ids).agg( Country=('Country', 'first'), Arrival=('Arrival', 'first'), Departure=('Departure', 'last') ).reset_index(drop=True) # 输出结果 print(result_df)
代码解释
df['Country'].ne(df['Country'].shift()):对比当前行与上一行的Country,返回布尔值(不同为True,相同为False),以此区分连续组的边界。.cumsum():将布尔序列转换为累加的组ID,每个连续相同的Country组会被分配同一个ID。groupby(group_ids).agg(...):按组聚合数据,每组保留第一个Country和Arrival,提取最后一个Departure;reset_index(drop=True)用于重置结果的索引,避免保留分组ID。
执行后得到的结果与需求一致:
Country Arrival Departure 0 China 08/06/2022 20:00 8/14/2022 12:54 1 United Kingdom 8/27/2022 06:36 09/02/2022 21:38 2 China 09/04/2022 21:38 09/06/2022 21:38
内容的提问来源于stack exchange,提问作者Lion_YY
相关产品推荐
相关产品推荐

