按ID分组标记DataFrame中与下一行值连续重复的行
问题
给定如下DataFrame:
import pandas as pd df = pd.DataFrame( {'id': [1,1,1,2,2,2,3,3,3], 'value': ['pot','pot','jebus','pot','jebus','pot','pot','jebus','jebus']} )
需要按id分组,标记出每组内当前行与下一行值完全相同的所有行(连续的两行都要标记为True),同时满足:
- 仅在同一
id分组内判断,跨id的首尾行即使值相同也不标记; - 非连续的重复值不标记,比如
'pot','jebus','pot'这种序列不需要标记。
期望的标记结果(对应每行):[True, True, False, False, False, False, True, True, True]
解决方法
利用pandas的分组、移位(shift)和布尔运算即可实现,代码如下:
# 1. 分组判断当前行与下一行的value是否相同 same_next = df.groupby('id')['value'].apply(lambda g: g == g.shift(-1)) # 2. 将当前行的标记与下一行的标记合并(逻辑或),确保连续两行都被标记 df['mark'] = same_next | same_next.shift(fill_value=False)
验证结果
执行代码后,原DataFrame会新增mark列:
id value mark 0 1 pot True 1 1 pot True 2 1 jebus False 3 2 pot False 4 2 jebus False 5 2 pot False 6 3 pot True 7 3 jebus True 8 3 jebus True
可以看到:
- id=1的前两行
pot连续相同,均标记为True; - id=3的后两行
jebus连续相同,均标记为True; - 其他非连续或跨id的行都正确标记为False,完全符合需求。
内容的提问来源于stack exchange,提问作者INGl0R1AM0R1
相关产品推荐
相关产品推荐

