如何按session去除instance的连续重复值(保留跨session重复)
解决DataFrame中按Session去除Instance连续重复项的问题
问题描述
需在DataFrame中实现以下规则:
- 仅去除同一session下
instance字段的连续重复项 - 不同session的相同
instance必须保留 - 同session内非连续的重复
instance必须保留
输入数据:
| session | instance |
|---|---|
| 1 | 3 |
| 1 | 5 |
| 1 | 5 |
| 2 | 5 |
| 3 | 2 |
| 3 | 2 |
| 3 | 5 |
| 3 | 2 |
期望输出:
| session | instance |
|---|---|
| 1 | 3 |
| 1 | 5 |
| 2 | 5 |
| 3 | 2 |
| 3 | 5 |
| 3 | 2 |
原代码df = df.loc[df['instance'].shift(-1) != df['instance']]的问题:未按session分组,直接全局比较instance移位值,会误删跨session的连续相同instance(比如session1的最后一个5和session2的5会被错误过滤)。
修正后的代码
通过groupby按session分组,仅在组内比较instance的连续值:
# 生成过滤掩码:同一session内,当前行instance与上一行不同,或为组内第一行 mask = df.groupby('session')['instance'].shift().ne(df['instance']) | df.groupby('session')['instance'].shift().isna() # 应用掩码得到结果 df_result = df[mask]
也可以写成更简洁的单行形式:
df_result = df[df.groupby('session')['instance'].shift().ne(df['instance']) | df.groupby('session')['instance'].shift().isna()]
代码说明
df.groupby('session')['instance'].shift():按session分组后,获取每个组内上一行的instance值,组内第一行的移位结果为NaN.ne(df['instance']):判断当前行instance与组内上一行是否不同| df.groupby('session')['instance'].shift().isna():保留每个组的第一行(移位后为NaN,isna()返回True)- 最终掩码会保留:每个组的第一行,以及组内与上一行
instance不同的行,完全符合需求。
验证结果
运行代码后,输入数据会被处理为期望的输出格式:
- session1中连续的5被去除一个
- session2的5与session1的5分属不同组,被保留
- session3中2→5→2的非连续重复值全部保留
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

