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

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的内容完全匹配你需要的格式:

codestatus
a6月变更为inactive
b3月变更为active
c无变更

注:若你需要b的输出为4月变更为active,删除代码中first_change_month后的- 1即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:36:04