如何从Pandas DataFrame列中提取连续值组的首尾行?
提取Pandas DataFrame中连续相同值组的首行与末行
问题分析
drop_duplicates()是全局去重逻辑,无法识别连续相同值的分组;单纯用shift()只能筛选出每组的首行(当前值≠前一行),但没法直接获取末行。要同时提取连续组的首末行,可采用以下两种简洁方案:
示例数据
先构造测试用的DataFrame:
import pandas as pd data = { 'group': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C'], 'value': [1, 2, 3, 4, 5, 6, 7, 8, 9] } df = pd.DataFrame(data)
预期输出:
group value 0 A 1 2 A 3 3 B 4 4 B 5 5 C 6 8 C 9
方法一:布尔索引直接筛选
通过判断当前值与前一行不同(首行)或当前值与后一行不同(末行),生成筛选掩码:
# 生成首行和末行的筛选条件 is_first = df['group'] != df['group'].shift() is_last = df['group'] != df['group'].shift(-1) # 合并条件,筛选目标行 result = df[is_first | is_last] print(result)
这种方法最直观,无需额外分组,适合快速提取首末行。
方法二:分组提取首末元素
先给连续相同值的组分配唯一ID,再按分组提取每组的第一行和最后一行:
# 生成连续分组的ID:每次值变化时ID+1 df['group_id'] = df['group'].ne(df['group'].shift()).cumsum() # 按分组提取首行和末行,然后重置索引 result = df.groupby('group_id').apply(lambda x: x.iloc[[0, -1]]).reset_index(drop=True) # 可选:删除临时的group_id列 result = result.drop('group_id', axis=1) print(result)
这种方法适合需要对每个连续组做更多后续处理的场景。
内容的提问来源于stack exchange,提问作者Chopin
相关产品推荐
相关产品推荐

