Python Pandas:提取连续分组中每个Jane组的首行数据
解决方法
这里提供两种实现方式,都能快速得到你想要的结果:
方法一:简洁版(一行核心逻辑)
直接通过对比当前行与上一行的name,筛选出连续Jane分组的第一行:
import pandas as pd df = pd.DataFrame({'name':['Jane','Jane','Mike','Mike','Jane','Jane','Jane', 'Mike','Mike','Jane','Jane','Jane'], 'ctg':['A','P','C','B','B','C','B','E','G','L','M','X']}) # 筛选目标行并重置索引 result = df[(df['name'] == 'Jane') & (df['name'] != df['name'].shift())].reset_index(drop=True) print(result)
逻辑说明
df['name'].shift():把name列整体向下移动一行,第一行变为空值(NaN),这样就能和当前行的name做对比。df['name'] != df['name'].shift():生成布尔列,当当前行name和上一行不同时为True,这正好对应每个连续分组的起始行。- 结合
df['name'] == 'Jane'筛选,就只保留连续Jane分组的第一行,最后用reset_index(drop=True)整理索引。
方法二:分步版(更易理解)
如果觉得简洁版有点绕,可以分步拆解操作,更适合新手理清逻辑:
import pandas as pd df = pd.DataFrame({'name':['Jane','Jane','Mike','Mike','Jane','Jane','Jane', 'Mike','Mike','Jane','Jane','Jane'], 'ctg':['A','P','C','B','B','C','B','E','G','L','M','X']}) # 1. 标记每行是否是Jane df['is_jane'] = df['name'] == 'Jane' # 2. 给连续的Jane分组:每次遇到非Jane,分组号+1,让连续Jane处于同一分组 df['jane_group'] = (~df['is_jane']).cumsum() # 3. 筛选Jane的行,按分组取第一行,再整理列和索引 result = df[df['is_jane']].groupby('jane_group').first().reset_index(drop=True)[['name', 'ctg']] print(result)
逻辑说明
- 先标记出所有Jane的行,方便后续筛选。
- 通过
(~df['is_jane']).cumsum()生成分组号:非Jane的行会被转为True(相当于1),累加后每次遇到非Jane,分组号就会递增,这样连续的Jane会被分到同一个组里。 - 筛选出Jane的行后,按分组号聚合取第一行,最后去掉多余的中间列,重置索引得到结果。
两种方法运行后都会输出你预期的结果:
| name | ctg |
|---|---|
| Jane | A |
| Jane | B |
| Jane | L |
内容的提问来源于stack exchange,提问作者K.Stefan
相关产品推荐
相关产品推荐

