如何按ID对重复日期计数生成period列?求解决方案
问题解决:基于ID对日期生成连续编号的period列
输入数据
ID Date A 20/05/2023 A 20/05/2023 B 21/05/2023 B 22/05/2023 B 23/05/2023 C 22/05/2023 C 23/05/2023 D 22/05/2023 D 22/05/2023 D 23/05/2023 D 24/05/2023
期望输出
ID Date period A 20/05/2023 1 A 20/05/2023 1 B 21/05/2023 1 B 22/05/2023 2 B 23/05/2023 3 C 22/05/2023 1 C 23/05/2023 2 D 22/05/2023 1 D 22/05/2023 1 D 23/05/2023 2 D 24/05/2023 3
解决方案
Python(Pandas)
核心逻辑:按ID分组后,对组内日期用稠密排名(dense rank)——相同日期共享同一编号,不同日期按升序生成连续序号,完全匹配需求。
import pandas as pd # 构造示例数据(实际可替换为读取你的数据源) df = pd.DataFrame({ 'ID': ['A', 'A', 'B', 'B', 'B', 'C', 'C', 'D', 'D', 'D', 'D'], 'Date': ['20/05/2023', '20/05/2023', '21/05/2023', '22/05/2023', '23/05/2023', '22/05/2023', '23/05/2023', '22/05/2023', '22/05/2023', '23/05/2023', '24/05/2023'] }) # 转换为日期格式,确保排序逻辑正确 df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y') # 生成period列:分组后对日期做稠密排名 df['period'] = df.groupby('ID')['Date'].transform(lambda x: x.rank(method='dense', ascending=True).astype(int)) # 转回原日期字符串格式(可选,根据需求调整) df['Date'] = df['Date'].dt.strftime('%d/%m/%Y') print(df)
R语言(dplyr)
用稠密排名实现相同效果:
library(dplyr) # 构造示例数据 df <- data.frame( ID = c("A", "A", "B", "B", "B", "C", "C", "D", "D", "D", "D"), Date = c("20/05/2023", "20/05/2023", "21/05/2023", "22/05/2023", "23/05/2023", "22/05/2023", "23/05/2023", "22/05/2023", "22/05/2023", "23/05/2023", "24/05/2023") ) # 转换日期格式 df$Date <- as.Date(df$Date, format = "%d/%m/%Y") # 分组生成period列 df <- df %>% group_by(ID) %>% mutate(period = dense_rank(Date)) %>% ungroup() # 转回原日期格式(可选) df$Date <- format(df$Date, "%d/%m/%Y") print(df)
为什么freq不行?
freq函数的作用是统计每个值的出现次数,而你需要的是同一ID下不同日期的顺序编号,相同日期共享同一编号,所以稠密排名(dense rank)才是对应需求的方法。
内容的提问来源于stack exchange,提问作者BD'auria
相关产品推荐
相关产品推荐

