如何在Pandas中依据前一行条件识别符合要求的‘Winner’周?
如何在Pandas中标记符合条件的"Winner"周
我来帮你搞定这个需求!根据你描述的规则,我们可以用Pandas的内置方法高效实现,不用复杂的lambda或者冗余循环(当然循环也能做,但Pandas风格的向量化操作更简洁高效)。
核心规则回顾
要标记为Winner的周必须同时满足两个条件:
- 当前周的
Weekly_counts> 周平均值的20%(或者你预先计算好的Winner_Num阈值) - 前一周没有被标记为
Winner
实现步骤(分两种场景)
场景1:需要自己计算Winner阈值(基于周平均值的20%)
假设你的数据集是名为df的Pandas DataFrame,包含Weekly_counts列,步骤如下:
- 计算判定阈值:先算出周计数的平均值,再乘以1.2(即比平均值高20%)
# 计算周计数的平均值 weekly_avg = df['Weekly_counts'].mean() # 生成Winner的判定阈值 winner_threshold = weekly_avg * 1.2
- 标记候选行:先筛选出所有满足计数条件的行
df['is_candidate'] = df['Weekly_counts'] > winner_threshold
- 应用"前一周不是Winner"的规则:用
shift()获取前一行的候选状态,通过布尔运算得到最终结果
# 最终Winner列:满足计数条件,且前一行不是候选(第一行无前置行,默认符合条件) df['Winner'] = df['is_candidate'] & ~df['is_candidate'].shift(1).fillna(False)
场景2:已经有预先计算好的Winner_Num列(对应Excel里的H列)
如果你的DataFrame已经包含Winner_Num阈值列,直接用它判断计数条件即可,步骤更简洁:
# 标记候选行 df['is_candidate'] = df['Weekly_counts'] > df['Winner_Num'] # 生成最终Winner标记 df['Winner'] = df['is_candidate'] & ~df['is_candidate'].shift(1).fillna(False)
为什么你之前用shift()和lambda没成功?
大概率是没处理好两个条件的逻辑组合,或者忽略了第一行的NaN问题(shift()后第一行的前一行状态是缺失值,需要用fillna(False)补全)。上面的代码用向量化布尔运算,既简洁又高效,还能避免循环带来的性能损耗。
验证结果
你可以打印df查看完整结果,或者用df[df['Winner']]筛选出所有Winner周,检查是否符合预期。
内容的提问来源于stack exchange,提问作者Hammond
相关产品推荐
相关产品推荐

