基于Pandas识别任务历史表中Factor列的变更情况
实现任务Factor字段变更标记的解决方案
步骤分解与代码实现
先处理日期格式并完成排序,再按ID分组识别Factor字段的变更情况,最终为每个Factor列生成对应的变更标记列。
1. 数据预处理(日期转换与排序)
将Date列转换为datetime类型保证排序逻辑准确,随后按ID和Date升序排序:
import pandas as pd data = [[1,'12/12/2021','A',500],[2,'10/20/2021','D',200],[3,'7/2/2022','E',300], [1,'5/2/2022','B',500],[1,'8/2/2022','B',500],[3,'10/2/2022','C',200], [2,'1/5/2022','D',200]] df = pd.DataFrame(data, columns=['ID', 'Date','Factor1','Factor2']) # 转换日期格式并排序 df['Date'] = pd.to_datetime(df['Date']) df = df.sort_values(['ID', 'Date'], ascending=[True, True])
2. 识别Factor字段变更并生成标记列
筛选所有含Factor的列,按ID分组后判断每组内该字段是否存在不同值,以此生成变更标记列:
# 获取所有Factor列 factor_cols = [col for col in df.columns if 'Factor' in col] # 为每个Factor列生成变更标记 for col in factor_cols: # 用transform将分组结果映射到每一行,判断组内是否有超过1个唯一值 df[f'{col}_has_change'] = df.groupby('ID')[col].transform(lambda x: x.nunique() > 1)
3. 最终输出结果
执行上述代码后,DataFrame会新增Factor1_has_change和Factor2_has_change列,标记对应ID的该Factor字段是否发生过变更:
ID Date Factor1 Factor2 Factor1_has_change Factor2_has_change 0 1 2021-12-12 A 500 True False 3 1 2022-05-02 B 500 True False 4 1 2022-08-02 B 500 True False 1 2 2021-10-20 D 200 False False 6 2 2022-01-05 D 200 False False 2 3 2022-07-02 E 300 True True 5 3 2022-10-02 C 200 True True
后续分析说明
生成标记列后,可通过以下方式统计各Factor列的变更频率:
- 统计每个Factor列中
True的数量(即发生变更的ID数量):
change_counts = {col: df[f'{col}_has_change'].sum() for col in factor_cols} # 按变更数量排序 sorted_change_counts = sorted(change_counts.items(), key=lambda x: x[1], reverse=True) print(sorted_change_counts)
内容的提问来源于stack exchange,提问作者JJH
相关产品推荐
相关产品推荐

