基于ID与Data列识别状态变更并生成新DataFrame
问题解决:识别DataFrame中Status的变更并生成目标表
原始数据
| ID | Status | Data | Column |
|---|---|---|---|
| 1 | A | Old | 111 |
| 2 | B | Old | 222 |
| 3 | C | Old | 333 |
| 2 | C | New | 222 |
| 3 | D | New | 333 |
| 1 | E | New | 111 |
| 4 | E | New | 444 |
| 4 | E | Old | 444 |
需求
基于ID和Data列识别Status的变更,生成包含变更状态、最终状态的新表,且结果不受原表中ID和Data的排列顺序影响,预期输出如下:
预期输出
| ID | Change Status | Data | Final Status | Column |
|---|---|---|---|---|
| 1 | A -> E | New | E | 111 |
| 2 | B -> C | New | C | 222 |
| 3 | C -> D | New | D | 333 |
| 4 | No Change | New | E | 444 |
实现代码(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'))
代码解释
- 分组提取状态:按
ID分组,不管原表中ID和Data的顺序,直接提取每个ID下Data=Old和Data=New对应的Status值,同时保留Column(同ID下Column值一致,随便取一个即可); - 生成变更描述:对比Old和New的Status,不一样就显示
旧状态->新状态,一样就标No Change; - 调整列结构:把列调整成预期的顺序,固定Data列显示
New,Final Status直接用New对应的状态。
这样不管原表中ID和Data的行怎么排,只要每个ID都有Old和New的记录,就能正确生成结果。
内容的提问来源于stack exchange,提问作者DJKarma
相关产品推荐
相关产品推荐

