Python实现DataFrame列状态变更标记及自定义状态报表生成
DataFrame状态变更报表实现方案
核心逻辑
按code维度分组,对每组数据按月份升序排序后,对比初始状态和后续所有状态,判断是否存在变更:
- 无变更直接返回「无变更」
- 有变更则取第一次变更对应的月份,按需求格式拼接变更描述
完整代码
import pandas as pd # 构造测试数据,替换为你的实际数据即可 df = pd.DataFrame({ 'code': ['a', 'b', 'c', 'b', 'a', 'c'], 'status': ['Active', 'Inactive', 'Active', 'Active', 'Inactive', 'Active'], 'Month': [1, 2, 3, 4, 7, 8] }) def get_change_desc(group): # 按月份从小到大排序 group_sorted = group.sort_values('Month', ignore_index=True) init_status = group_sorted.loc[0, 'status'] # 筛选所有和初始状态不一致的记录 change_records = group_sorted[group_sorted['status'] != init_status] if change_records.empty: return '无变更' # 取第一次变更的月份和新状态 first_change_month = change_records.iloc[0]['Month'] new_status = change_records.iloc[0]['status'].lower() # 若你需要直接用变更发生的月份,删除下方的 `- 1` 即可 return f"{first_change_month - 1}月变更为{new_status}" # 生成结果表 result_df = df.groupby('code', as_index=False).apply( lambda x: pd.Series({'status': get_change_desc(x)}) )
输出结果
最终result_df的内容完全匹配你需要的格式:
| code | status |
|---|---|
| a | 6月变更为inactive |
| b | 3月变更为active |
| c | 无变更 |
注:若你需要b的输出为
4月变更为active,删除代码中first_change_month后的- 1即可。
内容的提问来源于stack exchange,提问作者PaulCoder
相关产品推荐
相关产品推荐

