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

如何为Pandas DataFrame标记事件数据段的起始与结束?

实现方案

要实现标记事件段的起始和结束,可以通过以下步骤用Pandas完成:

1. 构造示例数据(已有目标DataFrame可跳过)

先还原你的示例数据集:

import pandas as pd
import numpy as np

data = {
    'year-quarter': ['2014Q1', '2014Q2', '2014Q3', '2014Q4', '2015Q1', '2015Q2', '2015Q3', '2015Q4', '2016Q1', '2016Q2', '2016Q3', '2016Q4', '2017Q1', '2017Q2'],
    'continuous data': [0.29, 0.31, 0.32, 0.29, 0.11, 0.23, 0.24, 0.25, 0.26, 0.21, 0.12, 0.20, 0.21, 0.25],
    'event data': [np.nan, np.nan, 1, 3, np.nan, np.nan, np.nan, 2, 1, 1, 1, np.nan, np.nan, 3]
}
df = pd.DataFrame(data)

2. 标记事件行并生成事件段分组

先标记event data非空的事件行,再给连续的事件行分配唯一分组ID:

# 标记是否为事件行
df['is_event'] = df['event data'].notna()
# 生成事件段分组ID:非事件行ID为0,连续事件行共享同一ID
df['group_id'] = df['is_event'].ne(df['is_event'].shift()).cumsum() * df['is_event']

3. 生成start和end列

通过分组统计,标记每个事件段的起始行和结束行:

# 标记start:每个事件段的第一行为1,其余为NaN
df['start'] = np.where(
    (df['group_id'] != 0) & (df.groupby('group_id').cumcount() == 0),
    1,
    np.nan
)

# 标记end:每个事件段的最后一行为1,其余为NaN
df['end'] = np.where(
    (df['group_id'] != 0) & (df.groupby('group_id').cumcount() == df.groupby('group_id')['is_event'].transform('size') - 1),
    1,
    np.nan
)

4. 清理辅助列

移除中间生成的临时列:

df = df.drop(['is_event', 'group_id'], axis=1)

执行完上述代码后,DataFrame会生成符合预期的start和end列。

内容的提问来源于stack exchange,提问作者Victor Schousboe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:45:00