title: Attribute change with variable number of time steps
body: <p>I would like to simulate individual changes in growth and mortality for a variable number of days. My dataframe is formatted as follows...</p>
  <pre><code>    import pandas as pd
  
      data = {'unique_id':  ['2', '4', '5', '13'],
              'length': ['27.7', '30.2', '25.4', '29.1'],
              'no_fish': ['3195', '1894', '8', '2774'],
              'days_left': ['253', '253', '254', '256'],
              'growth': ['0.3898', '0.3414', '0.4080', '0.3839']
             }
  
      df = pd.DataFrame(data)
  
      print(df)
  
        unique_id length no_fish days_left  growth
      0         2   27.7    3195       253  0.3898
      1         4   30.2    1894       253  0.3414
      2         5   25.4       8       254  0.4080
      3        13   29.1    2774       256  0.3839
      
  </code></pre>
  <p>Ideally, I would like the initial length (i.e., length) to increase by the daily growth rate (i.e., growth) for each of the days remaining in the year (i.e., days_left).</p>
  <pre><code>    df['final'] = df['length'] + (df['days_left'] * df['growth']
  </code></pre>
  <p>However, I would also like to update the number of fish that each individual represents (i.e., no_fish) on a daily basis using a size-specific equation. I'm fairly new to python so I initially thought to use a for-loop (I'm not sure if there is another, more efficient way). My code is as follows:</p>
  <pre><code># keep track of run time - START
  start_time = time.perf_counter()
  
  df['z'] = 0.0
  for indx in range(len(df)): 
      count = 1
      while count &lt;= int(df.days_to_forecast[indx]):
     
          # (1) update individual length
          df.lgth[indx] = df.lgth[indx] + df.linearGR[indx]
      
          # (2) estimate daily size-specific mortality 
          if df.lgth[indx] &gt; 50.0:
              df.z[indx] = 0.01
          else:
              if df.lgth[indx] &lt;= 50.0:
                  df.z[indx] = 0.052857-((0.03/35)*df.lgth[indx])
              elif df.lgth[indx] &lt; 15.0:
                  df.z[indx] = 0.728*math.exp(-0.1892*df.lgth[indx])
      
          df['no_fish'].round(decimals = 0)
          if df.no_fish[indx] &lt; 1.0:
              df.no_fish[indx] = 0.0
          elif df.no_fish[indx] &gt;= 1.0:
              df.no_fish[indx] = df.no_fish[indx]*math.exp(-(df.z[indx]))
      
          # (3) reduce no. of days left in forecast by 1
          count = count + 1
  
  # keep track of run time - END
  total_elapsed_time = round(time.perf_counter() - start_time, 2)
  print(&quot;Forecast iteration completed in {} seconds&quot;.format(total_elapsed_time)) 
  </code></pre>
  <p>The above code now works correctly, but it is still far to inefficient to run for 40,000 individuals each for 200+ days.</p>
  <p><strong>I would really appreciate any advice on how to modify the following code to make it pythonic</strong>.</p>
  <p>Thanks</p>