如何用Pandas按keyword与id组合判断rank的正向趋势?
按Keyword+ID组合判断Rank趋势的解决方案
处理步骤
- 统一日期格式:将
date列转为可排序的datetime类型,避免因格式混乱导致时间排序错误。 - 分组并按时间排序:按
keyword和id组合分组,每组内按日期升序排列,确保数据按时间顺序梳理。 - 判定趋势方向:对比每组内最早和最晚记录的
rank值,确定趋势:- 最终rank > 初始rank:标记为
positive(1) - 最终rank < 初始rank:标记为
negative(-1) - rank无变化:标记为
neutral(0)(可按需保留或过滤)
- 最终rank > 初始rank:标记为
完整代码实现
import pandas as pd # 构造示例数据集 data = pd.DataFrame({ 'keyword': ['test']*12, 'id': [185,999,810,442,188,185,999,810,442,188,185,185], 'rank': [45,44,43,42,41,45,41,43,42,41,48,90], 'date': ['11/3/2001','11/3/2001','11/3/2001','11/3/2001','11/3/2001', '11/3/2001','11/3/2004','11/3/2001','11/3/2001','11/3/2001', '20/04/2002','20/05/2003'] }) # 转换日期列,自动识别多种日/月/年格式 data['date'] = pd.to_datetime(data['date'], dayfirst=True) # 定义趋势判断函数 def judge_trend(group): # 按时间排序 sorted_group = group.sort_values('date') first_rank = sorted_group['rank'].iloc[0] last_rank = sorted_group['rank'].iloc[-1] if last_rank > first_rank: return 'positive(1)' elif last_rank < first_rank: return 'negative(-1)' else: return 'neutral(0)' # 分组计算趋势 trend_result = data.groupby(['keyword', 'id']).apply(judge_trend).reset_index(name='trend') # 输出完整结果 print(trend_result)
运行结果
keyword id trend 0 test 185 positive(1) 1 test 188 neutral(0) 2 test 442 neutral(0) 3 test 810 neutral(0) 4 test 999 negative(-1)
如果只需要显示有变化的分组,可过滤掉neutral记录:
filtered_result = trend_result[trend_result['trend'] != 'neutral(0)'] print(filtered_result)
输出与你期望的示例一致:
keyword id trend 0 test 185 positive(1) 4 test 999 negative(-1)
内容的提问来源于stack exchange,提问作者user765443
相关产品推荐
相关产品推荐

