如何在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
相关产品推荐
相关产品推荐

