如何在DataFrame中提取分组内Stage列值发生变化的行
解决方法
步骤说明
- 排序DataFrame:先按
Rep、Name、Time升序排序,确保每个(Rep, Name)组内的记录按时间顺序排列,这样才能准确对比前后状态变化。 - 标记状态变化行:按
Rep和Name分组,用shift()方法获取每组内前一行的Stage值,与当前行的Stage对比,标记出状态发生变化的行。 - 筛选目标行:筛选出状态发生变化且当前
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
相关产品推荐
相关产品推荐

