Apply Numpy function over entire Dataframe
<p>I am applying this function over a dataframe <code>df1</code> such as the following:</p>

<pre><code>                          AA          AB             AC           AD  
2005-01-02 23:55:00      "EQUITY"    "EQUITY"      "EQUITY"     "EQUITY"   
2005-01-03 00:00:00        32.32      19.5299        32.32      31.0455   
2005-01-04 00:00:00      31.9075      19.4487      31.9075      30.3755   
2005-01-05 00:00:00      31.6151      19.5799      31.6151       29.971   
2005-01-06 00:00:00      31.1426      19.7174      31.1426      29.9647  

def func(x):
    for index, price in x.iteritems():
      x[index] = price / np.sum(x,axis=1)
    return x[index]

df3=func(df1.ix[1:])
</code></pre>

<p>However, I only get a single column returned as opposed to 3</p>

<pre><code>    2005-01-03    0.955843
    2005-01-04    0.955233
    2005-01-05    0.955098
    2005-01-06    0.955773
    2005-01-07    0.955877
    2005-01-10     0.95606
    2005-01-11     0.95578
    2005-01-12    0.955621
</code></pre>

<p>I am guessing I am missing something in the formula to make it apply to the entire dataframe. Also how could I return the first index that has strings in its row?</p>

<p>You need to do it the following way :</p>

<pre><code>def func(row):
    return row/np.sum(row)
df2 = pd.concat([df[:1], df[1:].apply(func, axis=1)], axis=0)
</code></pre>

<p>It has 2 steps :</p>

<ol>
<li><code>df[:1]</code> extracts the first row, which contains strings, while <code>df[1:]</code> represents the rest of the DataFrame. You concatenate them later on, which answers the second part of your question.</li>
<li>For operating over rows you should use <code>apply()</code> method.</li>
</ol>

python pandas numpy dataframe