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

如何在DataFrame中提取分组内Stage列值发生变化的行

解决方法

步骤说明

  1. 排序DataFrame:先按Rep、Name、Time升序排序,确保每个(Rep, Name)组内的记录按时间顺序排列,这样才能准确对比前后状态变化。
  2. 标记状态变化行:按Rep和Name分组,用shift()方法获取每组内前一行的Stage值,与当前行的Stage对比,标记出状态发生变化的行。
  3. 筛选目标行:筛选出状态发生变化且当前Stage不为none的行(从其他状态变回none的行不在期望结果中),最后移除辅助标记列得到目标DataFrame。

完整代码

import pandas as pd

# 构造输入DataFrame(实际使用时可替换为你的数据源读取逻辑)
data = [
    [1, 33.075, 'Tom', 'none'],
    [1, 85.972, 'Tom', 'incubation'],
    [1, 86.139, 'Tom', 'incubation'],
    [1, 29.120, 'Sam', 'none'],
    [1, 33.099, 'Sam', 'incubation'],
    [1, 90.568, 'Sam', 'symptomatic'],
    [2, 33.075, 'Tom', 'none'],
    [2, 85.972, 'Tom', 'incubation'],
    [2, 29.120, 'Tom', 'none'],
    [2, 33.099, 'Sam', 'none'],
    [2, 90.568, 'Sam', 'none'],
    [3, 32.515, 'Tom', 'none'],
    [3, 90.863, 'Joe', 'symptomatic'],
    [3, 86.139, 'Joe', 'incubation'],
    [3, 85.972, 'Tom', 'incubation'],
    [3, 29.120, 'Joe', 'none'],
]
df = pd.DataFrame(data, columns=['Rep', 'Time', 'Name', 'Stage'])

# 按指定字段排序
df_sorted = df.sort_values(by=['Rep', 'Name', 'Time'])

# 标记每组内Stage发生变化的行
df_sorted['stage_changed'] = df_sorted.groupby(['Rep', 'Name'])['Stage'].shift() != df_sorted['Stage']

# 筛选目标行并移除辅助列
result = df_sorted[(df_sorted['stage_changed']) & (df_sorted['Stage'] != 'none')].drop(columns='stage_changed')

# 重置索引(可选,让结果索引更整洁)
result = result.reset_index(drop=True)

# 输出结果
print(result)

运行后得到的结果与你给出的期望DataFrame完全一致。

内容的提问来源于stack exchange,提问作者G Adams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:24:53