What is the difference between Pandas Series.apply() and Series.map()?
<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.map.html" rel="noreferrer">Series.map()</a>:

<blockquote>
  <p>Map values of Series using input correspondence (which can be a dict, Series, or function)</p>
</blockquote>

<a href="http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.Series.apply.html" rel="noreferrer">Series.apply()</a>

<blockquote>
  <p>Invoke function on values of Series. Can be ufunc (a NumPy function that applies to the entire Series) or a Python function that only works on single values</p>
</blockquote>

<p><code>apply()</code> seems like it does mostly everything <code>map()</code> does, vectorizing scalar functions while applying vectorized operations as they are. Meanwhile <code>map()</code> allows for some amount of control over null value handling. Apart from historical analogy to Python's <code>apply()</code> and <code>map()</code> functions, is there a reason to prefer one over the other in general use? Why wouldn't these functions just be combined?</p>