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

基于ID与Data列识别状态变更并生成新DataFrame

问题解决:识别DataFrame中Status的变更并生成目标表

原始数据

IDStatusDataColumn
1AOld111
2BOld222
3COld333
2CNew222
3DNew333
1ENew111
4ENew444
4EOld444

需求

基于ID和Data列识别Status的变更,生成包含变更状态、最终状态的新表,且结果不受原表中ID和Data的排列顺序影响,预期输出如下:

预期输出

IDChange StatusDataFinal StatusColumn
1A -> ENewE111
2B -> CNewC222
3C -> DNewD333
4No ChangeNewE444

实现代码(Pandas)

import pandas as pd

# 构造原始数据(实际场景可替换为读取你的数据源,比如pd.read_csv)
df = pd.DataFrame({
    'ID': [1,2,3,2,3,1,4,4],
    'Status': ['A','B','C','C','D','E','E','E'],
    'Data': ['Old','Old','Old','New','New','New','New','Old'],
    'Column': [111,222,333,222,333,111,444,444]
})

# 按ID分组,提取每个ID对应的Old、New状态以及Column值
grouped_df = df.groupby('ID').apply(
    lambda x: pd.Series({
        'old_status': x[x['Data'] == 'Old']['Status'].iloc[0],
        'new_status': x[x['Data'] == 'New']['Status'].iloc[0],
        'column': x['Column'].iloc[0]
    })
).reset_index()

# 生成变更状态列
grouped_df['Change Status'] = grouped_df.apply(
    lambda row: f"{row['old_status']} -> {row['new_status']}" 
    if row['old_status'] != row['new_status'] 
    else 'No Change',
    axis=1
)

# 整理成目标列格式
result_df = grouped_df[['ID', 'Change Status']].assign(
    Data='New',
    Final Status=grouped_df['new_status'],
    Column=grouped_df['column']
)

# 输出结果(如果需要保存到文件可以用result_df.to_csv等方法)
print(result_df.to_markdown(index=False, tablefmt='grid'))

代码解释

  1. 分组提取状态:按ID分组,不管原表中ID和Data的顺序,直接提取每个ID下Data=Old和Data=New对应的Status值,同时保留Column(同ID下Column值一致,随便取一个即可);
  2. 生成变更描述:对比Old和New的Status,不一样就显示旧状态->新状态,一样就标No Change;
  3. 调整列结构:把列调整成预期的顺序,固定Data列显示New,Final Status直接用New对应的状态。

这样不管原表中ID和Data的行怎么排,只要每个ID都有Old和New的记录,就能正确生成结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:35:34