如何在Pandas DataFrame中按名称识别排名提升(数值下降)的产品趋势?
嘿,我懂你遇到的问题了!你之前的代码是对整个DataFrame做diff()计算,相当于把所有产品的排名混在一起对比了,完全没考虑按NAME分组分析——这肯定不是你要的效果对吧?
别担心,咱们只需要做两个关键调整就能解决:
第一步:先按产品和时间排序(必做!)
首先得确保每个产品的记录是按SNAPDATE的先后顺序排列的,不然diff()计算出来的差值会完全混乱:
df = df.sort_values(by=['NAME', 'SNAPDATE'])
第二步:按NAME分组计算排名差值
用groupby把数据按产品分组,然后在每个组内计算RANK的相邻差值,这样就只会对比同一个产品在不同时间的排名变化了:
import numpy as np import pandas as pd # 计算每个产品组内的RANK差值 df['rank_diff'] = df.groupby('NAME')['RANK'].diff() # 标记排名变化:注意哦,你说的「排名提升」对应RANK数值下降,也就是diff为负数 df['change'] = np.where( df['rank_diff'] < 0, '排名提升', # 这里可以换成你习惯的描述,比如'promoted' np.where( df['rank_diff'] > 0, '排名下降', # 对应RANK数值上升 '无变化' ) )
第三步:筛选出排名提升的产品
如果只想看那些有排名提升的记录,直接过滤就行:
promoted_records = df[df['change'] == '排名提升'] print(promoted_records)
小提醒
- 如果某个产品只有一条记录,
rank_diff会显示NaN,你可以根据需求用fillna()把它替换成类似「首次出现」的标记 - 一定要记得先排序!如果时间顺序乱了,差值的正负就会反过来,结果完全不对
内容的提问来源于stack exchange,提问作者Cyrille MODIANO
相关产品推荐
相关产品推荐

