如何基于条件及前一行状态识别Winner Week(Pandas问题)
问题修正方案
你的代码存在两个核心问题——逻辑不符合需求,以及触发SettingWithCopyWarning警告,以下是具体解决步骤:
一、解决SettingWithCopyWarning警告
警告的根源是new_df3可能是从其他DataFrame切片得到的视图而非副本,直接修改会有数据同步风险。先将其转为独立副本:
new_df3 = new_df3.copy()
二、修正Winner Week识别逻辑
你的原有逻辑完全偏离需求,正确需求是:当本周Weekly_Counts大于Winner_Num,且上一周不是Winner时,本周标记为'Winner',否则标记为'Not Winner'。
用Pandas向量化操作实现(比循环高效且简洁):
# 转为副本解决警告 new_df3 = new_df3.copy() # 初始化结果列为默认值"Not Winner" new_df3['Winner_Results'] = 'Not Winner' # 条件1:本周的Weekly_Counts超过Winner_Num cond1 = new_df3['Weekly_Counts'] > new_df3['Winner_Num'] # 条件2:上一周不是Winner(第一周无前置周,默认满足该条件) cond2 = new_df3['Winner_Results'].shift(1).fillna(True) != 'Winner' # 同时满足两个条件的行标记为"Winner" new_df3.loc[cond1 & cond2, 'Winner_Results'] = 'Winner'
关键说明:
- 用
shift(1)获取上一行的结果,第一行的shift结果为NaN,通过fillna(True)让第一周默认符合"上一周不是Winner"的条件 - 用
loc批量赋值,避免逐行循环的低效写法,同时彻底规避修改视图带来的警告 - 修正了你代码中列名错误:数据集列名为
Weekly_Counts,而非你写的Weekly_Votes_Counts
内容的提问来源于stack exchange,提问作者Hammond
相关产品推荐
相关产品推荐

