Pandas DataFrame去重:保留重复组首次及再次出现的首行
Pandas按分组去重:保留每次组合切换后的首行
你需要的不是全局去重,而是按顺序保留C_1、C_2组合每次切换后的首行,包括后续再次出现的相同组合的第一行。原来的drop_duplicates(['C_1','C_2'])会直接全局去重,只保留每个组合第一次出现的行,所以漏掉了后面再次出现的online offline组。
解决方案代码
from io import StringIO import pandas as pd dfa = pd.read_csv(StringIO(""" Date/Time C_1 C_2 "16/08/2023 3:00:15" online offline "16/08/2023 3:00:17" online offline "16/08/2023 3:00:18" offline online "16/08/2023 3:00:21" offline online "16/08/2023 3:00:24" offline online "16/08/2023 3:00:23" offline online "16/08/2023 3:00:26" offline online "16/08/2023 3:00:28" online offline "16/08/2023 3:00:31" online offline "16/08/2023 3:00:37" online offline "16/08/2023 3:00:39" online offline "16/08/2023 3:00:42" online offline"""), sep="\s+") # 标记当前行与上一行的C_1、C_2组合是否不同 mask = (dfa[['C_1', 'C_2']] != dfa[['C_1', 'C_2']].shift()).any(axis=1) # 筛选出所有组合切换的首行(包括第一行) df_result = dfa[mask].reset_index(drop=True) print(df_result)
输出结果
Date/Time C_1 C_2 0 16/08/2023 3:00:15 online offline 1 16/08/2023 3:00:18 offline online 2 16/08/2023 3:00:28 online offline
逻辑说明
dfa[['C_1', 'C_2']].shift()将每行的C_1、C_2值向上偏移一行,实现当前行与上一行的组合对比。!=判断当前行与上一行的组合是否存在差异,any(axis=1)表示只要C_1或C_2有一个不同,就标记为需要保留的行。- 第一行因为偏移后为NaN,对比结果自动为True,会被默认保留。
内容的提问来源于stack exchange,提问作者RKIDEV
相关产品推荐
相关产品推荐

