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

Python if判断异常 盈亏比计算多数错显为All Wins

问题根因

核心错误是混淆了Python的按位与运算符&和逻辑与运算符and,叠加运算符优先级不符合预期,导致条件判断逻辑完全错乱:

  • &是数值按位运算操作符,优先级高于==、>这类比较运算符;而做布尔条件组合、表示「同时满足两个条件」应该用and,它的优先级低于比较运算符,会按照正常预期的顺序执行判断。
  • 你写的判断条件比如win > 0 & loss == 0,实际执行顺序是:
    1. 先计算0 & loss,任何整数和0做按位与结果都是0
    2. 表达式变成Python链式比较:win > 0 == 0,等价于(win > 0) and (0 == 0)
    3. 其中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是pandas groupby()直接返回的对象,迭代出的每个元素是(分组键, 分组DataFrame)的元组,直接赋值给df会导致后续取数逻辑异常(你现在没报错是因为df[1]刚好取到了元组里的DataFrame,属于歪打正着)
  • 用iterrows()遍历取i是DataFrame的原始标签索引,如果分组后的df索引不是从0开始的连续整数,i == 0、df[1][i-1]取上一行的逻辑会报错或者取错值。
修复方案
  1. 把所有条件判断里的&替换为逻辑与and
  2. 如果直接遍历pandas groupby对象,循环要拆包接收分组键和DataFrame
  3. 遍历行统计相邻值变化时,用位置索引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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:21:20