Python if判断异常 盈亏比计算多数错显为All Wins
问题根因
核心错误是混淆了Python的按位与运算符&和逻辑与运算符and,叠加运算符优先级不符合预期,导致条件判断逻辑完全错乱:
&是数值按位运算操作符,优先级高于==、>这类比较运算符;而做布尔条件组合、表示「同时满足两个条件」应该用and,它的优先级低于比较运算符,会按照正常预期的顺序执行判断。- 你写的判断条件比如
win > 0 & loss == 0,实际执行顺序是:- 先计算
0 & loss,任何整数和0做按位与结果都是0 - 表达式变成Python链式比较:
win > 0 == 0,等价于(win > 0) and (0 == 0) - 其中
0 == 0永远为真,所以只要win>0,不管loss的值是多少,这个条件都会成立,直接返回All Wins,和你看到的错误现象完全一致。
- 先计算
- 其余两个判断分支也存在同样的问题,比如
win == 0 & loss == 0实际等价于(win == 0) and (0 == 0),只要win为0不管loss是多少都会进入这个分支返回0,和你输出里win=0、loss=1/2时返回0的错误表现也吻合。
另外代码里还有两个隐藏隐患:
- 如果
df_years_grouped是pandasgroupby()直接返回的对象,迭代出的每个元素是(分组键, 分组DataFrame)的元组,直接赋值给df会导致后续取数逻辑异常(你现在没报错是因为df[1]刚好取到了元组里的DataFrame,属于歪打正着) - 用
iterrows()遍历取i是DataFrame的原始标签索引,如果分组后的df索引不是从0开始的连续整数,i == 0、df[1][i-1]取上一行的逻辑会报错或者取错值。
修复方案
- 把所有条件判断里的
&替换为逻辑与and - 如果直接遍历pandas groupby对象,循环要拆包接收分组键和DataFrame
- 遍历行统计相邻值变化时,用位置索引
iloc取值,避免原始索引不连续导致的错误
修正后的代码如下:
trades = [] wins = [] losses = [] winloss = [] # 如果df_years_grouped是groupby对象,循环用下面这行 # for year, df in df_years_grouped: # 如果df_years_grouped是已经拆好的DataFrame列表,保留原来的循环写法即可 for df in df_years_grouped: total_trades = len(df) trades.append(total_trades) win = 0 loss = 0 # 从第二行(位置索引1)开始遍历,避免判断i==0和索引不连续问题 for pos in range(1, len(df)): cur_val = df.iloc[pos, 1] # 位置索引1对应你要统计的第2列数值 pre_val = df.iloc[pos-1, 1] if cur_val > pre_val: win += 1 elif cur_val < pre_val: loss += 1 wins.append(win) losses.append(loss) # 用and做逻辑判断 if win == 0 and loss == 0: winloss.append(0) elif win > 0 and loss == 0: winloss.append('All Wins') elif win == 0 and loss > 0: winloss.append('All Losses') else: winloss.append(win/loss)
内容的提问来源于stack exchange,提问作者boioboi
相关产品推荐
相关产品推荐

