title: NumPy or SciPy to calculate weighted median
body: <p>I'm trying to automate a process that JMP does (Analyze->Distribution, entering column A as the "Y value", using subsequent columns as the "weight" value).  In JMP you have to do this one column at a time - I'd like to use Python to loop through all of the columns and create an array showing, say, the median of each column.</p>
  
  <p>For example, if the mass array is [0, 10, 20, 30], and the weight array for column 1 is [30, 191, 9, 0], the weighted median of the mass array should be 10.  However, I'm not sure how to arrive at this answer.</p>
  
  <p>So far I've </p>
  
  <ol>
  <li>imported the csv showing the weights as an array, masking values of 0, and </li>
  <li>created an array of the "Y value" the same shape and size as the weights array (113x32).  I'm not entirely sure I need to do this, but thought it would be easier than a for loop for the purpose of weighting.</li>
  </ol>
  
  <p>I'm not sure exactly where to go from here.  Basically the "Y value" is a range of masses, and all of the columns in the array represent the number of data points found for each mass.  I need to find the median mass, based on the frequency with which they were reported.</p>
  
  <p>I'm not an expert in Python or statistics, so if I've omitted any details that would be useful let me know!</p>
  
  <p>Update:  here's some code for what I've done so far:</p>
  
  <pre><code>#Boilerplate &amp; Import files
  import csv
  import scipy as sp
  from scipy import stats
  from scipy.stats import norm
  import numpy as np
  from numpy import genfromtxt
  import pandas as pd
  import matplotlib.pyplot as plt
  
  inputFile = '/Users/cl/prov.csv'
  origArray = genfromtxt(inputFile, delimiter = ",")
  nArray = np.array(origArray)
  dimensions = nArray.shape
  shape = np.asarray(dimensions)
  
  #Mask values ==0
  maTest = np.ma.masked_equal(nArray,0)
  
  #Create array of masses the same shape as the weights (nArray)
  fieldLength = shape[0]
  rowLength = shape[1]
  
  for i in range (rowLength):
      createArr = np.arange(0, fieldLength*10, 10)
      nCreateArr = np.array(createArr)
      massArr.append(nCreateArr)
      nCreateArr = np.array(massArr)
  nmassArr = nCreateArr.transpose()
  </code></pre>