【问题标题】:For and while loop outputting longer list than it shouldFor 和 while 循环输出比它应该更长的列表
【发布时间】:2021-01-13 12:22:03
【问题描述】:

我正在尝试创建一个介于 0 和 100 之间的数字数组 (socarray)。该数组以单个项目 (整数 50) 启动。

要追加的数字是 soc,从 50 开始。soc 的值会根据数据帧 (df['Pred']) 中预测列的值而改变。

  • 如果 df['Pred']>0 且 soc
  • 如果 df['Pred'] 0 则 soc -=50 并附加 到 socarray
  • 否则我们只附加 soc(不添加或减去值)。

我的代码如下。我正在使用 For 循环、while 循环和 If 语句。

范围设置为迭代 10 次(数据帧的长度)。但是,代码的输出是一个长度为 82 的数组。

soc = 50
socarray = [50]


for i in range(1,10):
    
    counter = 1
    
    while counter < len(df):
        
        if (df.iloc[i]['Pred'] > 0) & (soc<100):
            soc += 50
            socarray.append(soc)
            counter += 1
            
        elif (df.iloc[i]['Pred'] < 0) & (soc>0):
            soc -= 50
            socarray.append(soc)
            counter += 1
            
        else:
            soc = soc
            socarray.append(soc)
            counter += 1
            

如果我将数组嵌入到 for 循环中,它会输出一个长度为 10 的数组,但它没有遵循正确的功能(特别是它不会在应该做的时候减去 'soc -= 50')

soc = 50


for i in range(1,len(df)):

        socarray = [50]

    
    counter = 1
    
    while counter < len(df):
        
        if (df.iloc[i]['Pred'] > 0) & (soc<100):
            soc += 50
            socarray.append(soc)
            counter += 1
            
        elif (df.iloc[i]['Pred MW'] < 0) & (soc>0):
            soc -= 50
            socarray.append(soc)
            counter += 1
            
        else:
            soc = soc
            socarray.append(soc)
            counter += 1

有人可以帮我吗?

【问题讨论】:

    标签: python pandas numpy for-loop while-loop


    【解决方案1】:

    您的 while 循环运行了 10 次。 for 循环中的每个范围一次。 因此,对于 82 个值,您的 while 循环每次 for 循环迭代运行约 8 次。

    在您的第二个示例中,您的 socarray 仅在循环内初始化后才被 for 循环的最后一次迭代填充。

    因为我没有数据框,所以很难测试。我认为这可以在没有内部 while 循环的情况下完成。

    您需要运行 10 次“算法”,因此范围 10 中的 for 循环就足够了。

    尝试删除 while 循环和计数器。

    soc = 50
    socarray = [50]
    
    
    for i in range(1,10):
    
    
        if (df.iloc[i]['Pred'] > 0) & (soc<100):
            soc += 50
            socarray.append(soc)
            counter += 1
            
        elif (df.iloc[i]['Pred'] < 0) & (soc>0):
            soc -= 50
            socarray.append(soc)
            counter += 1
            
        else:
            soc = soc
            socarray.append(soc)
            counter += 1
    

    【讨论】:

      【解决方案2】:

      考虑根据条件的范围总和分配一个新的数据框列。然后将该列转换为一维数组。请注意,所有算术(即+-)和不等式(即&lt;&gt;)运算符都已替换为相应的Pandas 函数:

      # ASSIGN NEW COLUMN AND FIRST ROW VALUE AS 50
      df['soc'] = np.nan
      df.loc[0, 'soc'] = 50
      
      # RE-ASSIGN COLUMN BY ROW AND CONDITION
      for i in range(len(df)):
         df.loc[i, 'soc'] = np.where((df.loc[i,'Pred'].gt(0)) & (df.loc[0:i,'soc'].sum().lt(100)), 
                                     df.loc[0:i,'soc'].sum().add(50),
                                     np.where((df.loc[i,'Pred'].lt(0)) & (df.loc[0:i,'soc'].gt(0)),
                                              df.loc[0:i,'soc'].sum().sub(50), 
                                              df.loc[0:i,'soc'].sum()
                                     )
                            )
      
      socarray = df['soc'].to_numpy()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-06
        • 2019-05-14
        • 2016-04-15
        • 2013-06-28
        • 2021-11-18
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        相关资源
        最近更新 更多