为DataFrame各分组统计指定日期前的行数累计值
解决方案
步骤1:转换日期列类型(推荐)
原始Date列为字符串格式,先转换为datetime类型,确保排序逻辑准确:
import pandas as pd # 假设你的DataFrame名为df df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
步骤2:确认数据排序(可选,若已排序可跳过)
确保数据按ID升序、Date降序排列,和你的原始数据结构一致:
df = df.sort_values(['ID', 'Date'], ascending=[True, False])
步骤3:新增统计列
通过groupby结合cumcount方法直接生成目标列:
df['number of times before that day'] = df.groupby('ID').cumcount(ascending=False)
原理说明
groupby('ID')将数据按ID分组,确保只统计同一ID下的记录cumcount(ascending=False)会对每个组内的行从最早日期的行开始从0计数,因此最新日期的行将得到「该组总行数-1」的结果,正好对应“该日期之前出现的次数”。
执行后得到的结果与你给出的预期完全一致:
ID Date number of times before that day E105 2021-04-28 3 E105 2021-02-28 2 E105 2020-12-23 1 E105 2020-11-29 0 E076 2021-07-07 7 E076 2021-06-20 6 ...
内容的提问来源于stack exchange,提问作者Apook
相关产品推荐
相关产品推荐

