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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:15:04