Pandas按ID分组生成事件前后时间序列中心编码列实现咨询
实现方案
你可以通过groupby配合自定义分组处理函数实现需求,完整可运行代码如下:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame( {'ID': ['1', '1', '1', '1', '1', '2' , '2', '3', '3'], 'Year': ["2012", "2013", "2014", "2015", "2016", "2012", "2013", "2012", "2013"], 'Event': ['0', '0', '0', '1','0', '0', '0', '1', '0']}) # 将Event列转为整数方便筛选事件行 df['Event'] = df['Event'].astype(int) # 定义分组处理函数 def calculate_period(group): # 筛选当前ID的事件行 event_row = group[group['Event'] == 1] # 如果当前ID无事件,所有行返回0 if event_row.empty: return pd.Series([0]*len(group), index=group.index) # 取事件行在当前分组内的位置偏移 event_idx = group.index.get_loc(event_row.index[0]) # 计算每行相对事件行的时间间隔 return pd.Series(range(len(group)) - event_idx, index=group.index) # 按ID分组应用函数,结果转字符串匹配示例输出格式 df['Period'] = df.groupby('ID', group_keys=False).apply(calculate_period).astype(str) # 输出结果和你给出的预期完全一致 print(df)
逻辑说明
- 首先把字符串类型的
Event转为整数,方便定位事件发生的行 - 按ID分组后,对每个分组先判断是否有事件发生:无事件则所有行Period赋值为0
- 有事件的分组,先取事件在组内的位置索引,用每行的组内索引减去事件索引,即可得到需要的正负间隔值
- 最后按需把结果转为字符串类型,和你给出的预期输出格式对齐
内容的提问来源于stack exchange,提问作者sk7785
相关产品推荐
相关产品推荐

