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

如何在Python中为每个ID的每行统计更早时间戳的数量?

解决按ID和日期统计历史事件数的问题

你之前用groupby('Id')['Date'].nunique()得到的是每个ID的总唯一日期数,这确实不是你要的每行日期之前的同ID事件数。咱们可以用pandas的分组累计计数来解决这个问题,步骤很清晰:

步骤1:确保日期格式正确

首先要把Date列转换成datetime类型,避免字符串排序出错:

import pandas as pd

# 你的原始数据
data = pd.DataFrame({
    'ID': [1, 1, 1, 2, 2],
    'Date': ['1/1/2010', '1/1/2011', '1/1/2012', '1/1/2010', '1/1/2011']
})

# 转换日期格式
data['Date'] = pd.to_datetime(data['Date'])

步骤2:按ID分组计算累计计数

用groupby结合cumcount()方法,它会在每个ID分组内从0开始逐行计数,正好对应“当前日期之前的历史事件数”(第一行没有历史事件,所以是0):

# 先按ID和日期排序(如果原始数据日期是乱序的话必须做这一步)
data = data.sort_values(['ID', 'Date'])

# 计算历史事件数
data['Historical_Incidents'] = data.groupby('ID').cumcount()

最终输出

运行后你会得到完全符合期望的结果:

ID       Date  Historical_Incidents
0   1 2010-01-01                     0
1   1 2011-01-01                     1
2   1 2012-01-01                     2
3   2 2010-01-01                     0
4   2 2011-01-01                     1

为什么这个方法可行?

cumcount()的作用是在每个分组内为每行分配一个从0开始的连续整数,正好对应到“当前行之前已经出现的同ID事件数量”。如果你的原始数据中同一ID的日期是按时间顺序排列的,直接用这个方法就可以;如果日期是乱序的,一定要先按ID和Date排序,不然计数会出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:34:31