You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中依据前一行条件识别符合要求的‘Winner’周?

如何在Pandas中标记符合条件的"Winner"周

我来帮你搞定这个需求!根据你描述的规则,我们可以用Pandas的内置方法高效实现,不用复杂的lambda或者冗余循环(当然循环也能做,但Pandas风格的向量化操作更简洁高效)。

核心规则回顾

要标记为Winner的周必须同时满足两个条件:

  • 当前周的Weekly_counts > 周平均值的20%(或者你预先计算好的Winner_Num阈值)
  • 前一周没有被标记为Winner

实现步骤(分两种场景)

场景1:需要自己计算Winner阈值(基于周平均值的20%)

假设你的数据集是名为df的Pandas DataFrame,包含Weekly_counts列,步骤如下:

  1. 计算判定阈值:先算出周计数的平均值,再乘以1.2(即比平均值高20%)
# 计算周计数的平均值
weekly_avg = df['Weekly_counts'].mean()
# 生成Winner的判定阈值
winner_threshold = weekly_avg * 1.2
  1. 标记候选行:先筛选出所有满足计数条件的行
df['is_candidate'] = df['Weekly_counts'] > winner_threshold
  1. 应用"前一周不是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:20:59