You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:04:55