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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:23:22