基于多条件为重复ID数据集添加Flag1与Flag2列的技术求助
为重复ID的时间周期数据集新增Flag1和Flag2列
原始数据集
ID Start_date End_date Hospital Work 00001 01JAN2015 15JAN2015 006 w 00001 16JAN2015 16JAN2015 006 p 00001 17JAN2015 20JAN2015 006 w 00001 21JAN2015 29JAN2015 006 f 00001 30JAN2015 02FEB2015 004 w 00001 03FEB2015 03FEB2015 004 s 00001 04FEB2015 08FEB2015 004 w 00001 09FEB2015 13FEB2015 004 f 00001 14FEB2015 16FEB2015 006 f 00001 17FEB2015 28DEC2016 006 w 00001 29DEC2016 31DEC2016 006 w .... ..... ...... ... ...
期望输出数据集
ID Start_date End_date Hospital Work Flag1 Flag2 00001 01JAN2015 15JAN2015 006 w 1 4 00001 16JAN2015 16JAN2015 006 p 4 9 00001 17JAN2015 20JAN2015 006 w 9 4 00001 21JAN2015 29JAN2015 006 f 4 9 00001 30JAN2015 02FEB2015 004 w 9 2 00001 03FEB2015 03FEB2015 004 s 2 9 00001 04FEB2015 08FEB2015 004 w 9 4 00001 09FEB2015 13FEB2015 004 f 4 9 00001 14FEB2015 16FEB2015 006 f 9 2 00001 17FEB2015 28DEC2016 006 w 2 4 00001 29DEC2016 31DEC2016 006 w 4 Stop .... ..... ...... ... ...
规则说明
- 每个ID的第一行数据,Flag1固定为1;
- Flag2取值规则(优先级从高到低):
- ID的最后一行填
Stop; - 当前行Hospital与下一行不同时,填2;
- Work字段为"w"时填4,非"w"(如f、s等)时填9;
- ID的最后一行填
- 除第一行外,Flag1取上一行的Flag2值。
实现方案(Python pandas)
针对350个重复ID的数据集,用pandas分组处理即可实现,代码如下:
import pandas as pd # 读取原始数据(若从文件读取可替换为pd.read_csv/pd.read_excel等方法) # df = pd.read_csv('your_dataset.csv') # 关键步骤:按ID和Start_date排序,保证每个ID下的时间顺序正确 df = df.sort_values(by=['ID', 'Start_date']).reset_index(drop=True) # 定义分组处理函数 def process_id_group(group): row_count = len(group) # 初始化Flag列 group['Flag1'] = None group['Flag2'] = None # 设置第一行Flag1 group.iloc[0, group.columns.get_loc('Flag1')] = 1 for i in range(row_count): # 处理Flag2 if i == row_count - 1: group.iloc[i, group.columns.get_loc('Flag2')] = 'Stop' else: # 检查Hospital是否变更 current_hosp = group.iloc[i]['Hospital'] next_hosp = group.iloc[i+1]['Hospital'] if current_hosp != next_hosp: group.iloc[i, group.columns.get_loc('Flag2')] = 2 else: # 根据Work字段赋值 group.iloc[i, group.columns.get_loc('Flag2')] = 4 if group.iloc[i]['Work'] == 'w' else 9 # 处理非第一行的Flag1 if i > 0: group.iloc[i, group.columns.get_loc('Flag1')] = group.iloc[i-1]['Flag2'] return group # 按ID分组处理所有数据 result_df = df.groupby('ID').apply(process_id_group).reset_index(drop=True) # 输出结果 print(result_df)
代码说明
- 排序是核心前提,确保每个ID下的记录按时间顺序排列;
- 分组后逐行处理每个ID的子数据集,严格遵循规则赋值;
- 用
iloc定位行列,避免索引混乱,保证处理准确性。
内容的提问来源于stack exchange,提问作者NewUsr
相关产品推荐
相关产品推荐

