4 down vote curve-fit is using leastsq for the calculation, so they should always give the same result. The miniscule difference you see there is probably a result of rounding error somewhere. calling leastsq directly should eliminate that. From the docs of curve_fit: The algorithm uses the Levenbe
Also note that xdata should be a (k, M) array, where k is the number of predictor variables (i.e. columns) and M is the number of observations (i.e. rows). You should therefore transpose your input dataframe so that it is (4, M) rather than (M, 4), i.e. table[['A', 'B', 'C', 'D']].T.