title: How to find column-index of top-n values within each row of huge dataframe
body: <p>I have a dataframe of format: (example data)</p>
  
  <pre><code>      Metric1  Metric2  Metric3  Metric4  Metric5
  ID    
  1     0.5      0.3      0.2      0.8      0.7    
  2     0.1      0.8      0.5      0.2      0.4    
  3     0.3      0.1      0.7      0.4      0.2    
  4     0.9      0.4      0.8      0.5      0.2    
  </code></pre>
  
  <p>where score range between [0,1] and I wish to generate a function that, for each id (row), calculates the top n metrics, where n is an input of the function along with the original dataframe. </p>
  
  <p>My ideal output would be:(for eg. n = 3)</p>
  
  <pre><code>      Top_1     Top_2     Top_3
  ID    
  1     Metric4   Metric5   Metric1    
  2     Metric2   Metric3   Metric5    
  3     Metric3   Metric4   Metric1    
  4     Metric1   Metric3   Metric4  
  </code></pre>
  
  <p>Now I have written a function that does work:</p>
  
  <pre><code>def top_n_partners(scores,top_n=3):
  metrics = np.array(scores.columns)
  records=[]
  for rec in scores.to_records():
      rec = list(rec)
      ID = rec[0]
      score_vals = rec[1:]
      inds = np.argsort(score_vals)
      top_metrics = metrics[inds][::-1]
      dic = {
          'top_score_%s' % (i+1):top_metrics[i]
          for i in range(top_n)
      }
      dic['ID'] = ID
      records.append(dic)
  top_n_df = pd.DataFrame(records)
  top_n_df.set_index('ID',inplace=True)
  return top_n_df
  </code></pre>
  
  <p>However it seems rather inefficient/slow especially for the volume of data I'd be running this over (dataframe with millions of rows) and I was wondering if there was a smarter way to go about this?</p>