Pandas按ID分组计算7天排名变化新增delta_rank_7列实现问题
实现方法
你之前的代码没有按id分组,会将全表所有行统一计算差值,不符合按id单独统计的需求,按以下步骤实现即可:
步骤1:数据预处理
首先要确保日期格式正确,且每个id的记录按时间顺序排列:
import pandas as pd # 导入数据集 df = pd.read_csv('https://raw.githubusercontent.com/amanaroratc/hello-world/master/test_df.csv') # 转换date列为日期格式,避免排序异常 df['date'] = pd.to_datetime(df['date']) # 按id、日期升序排序,保证每个id的记录按时间先后排列 df = df.sort_values(by=['id', 'date']).reset_index(drop=True)
步骤2:计算7天排名差值
如果你的数据是每个id每天都有1条记录,直接按id分组后对rank列做7阶差分即可,前7条数据会自动返回NaN,符合你的要求:
df['delta_rank_7'] = df.groupby('id')['rank'].diff(periods=7)
可选:严格按自然日7天间隔计算
如果部分id存在缺号、单日无数据的情况,需要严格计算自然日7天前的排名差,可以用时间偏移的方式实现:
# 将日期设为索引 df = df.set_index('date') # 按id分组,获取每个id7天前的排名 df['rank_7d_ago'] = df.groupby('id')['rank'].shift(freq='7D') # 计算差值 df['delta_rank_7'] = df['rank'] - df['rank_7d_ago'] # 恢复普通列结构 df = df.reset_index()
内容的提问来源于stack exchange,提问作者AmanArora
相关产品推荐
相关产品推荐

