Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between map, applymap and apply methods in Pandas

Can you tell me when to use these vectorization methods with basic examples?

I see that map is a Series method whereas the rest are DataFrame methods. I got confused about apply and applymap methods though. Why do we have two methods for applying a function to a DataFrame? Again, simple examples which illustrate the usage would be great!

like image 848
marillion Avatar asked Nov 05 '13 20:11

marillion


People also ask

What is the difference between apply Applymap and map function in Python?

apply() is used to apply a function along an axis of the DataFrame or on values of Series. applymap() is used to apply a function to a DataFrame elementwise. map() is used to substitute each value in a Series with another value.

Which is faster apply or map?

Series Map: We could also choose to map the function over each element within the Pandas Series. This is actually somewhat faster than Series Apply, but still relatively slow.

What does Applymap do in pandas?

Pandas DataFrame: applymap() function The applymap() function is used to apply a function to a Dataframe elementwise. This method applies a function that accepts and returns a scalar to every element of a DataFrame. Python function, returns a single value from a single value.

What is the difference between map and replace pandas?

They differ in the following: replace accepts str, regex, list, dict, Series, int, float, or None. map accepts a dict or a Series. They differ in handling null values.


2 Answers

Straight from Wes McKinney's Python for Data Analysis book, pg. 132 (I highly recommended this book):

Another frequent operation is applying a function on 1D arrays to each column or row. DataFrame’s apply method does exactly this:

In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])  In [117]: frame Out[117]:                 b         d         e Utah   -0.029638  1.081563  1.280300 Ohio    0.647747  0.831136 -1.549481 Texas   0.513416 -0.884417  0.195343 Oregon -0.485454 -0.477388 -0.309548  In [118]: f = lambda x: x.max() - x.min()  In [119]: frame.apply(f) Out[119]:  b    1.133201 d    1.965980 e    2.829781 dtype: float64 

Many of the most common array statistics (like sum and mean) are DataFrame methods, so using apply is not necessary.

Element-wise Python functions can be used, too. Suppose you wanted to compute a formatted string from each floating point value in frame. You can do this with applymap:

In [120]: format = lambda x: '%.2f' % x  In [121]: frame.applymap(format) Out[121]:              b      d      e Utah    -0.03   1.08   1.28 Ohio     0.65   0.83  -1.55 Texas    0.51  -0.88   0.20 Oregon  -0.49  -0.48  -0.31 

The reason for the name applymap is that Series has a map method for applying an element-wise function:

In [122]: frame['e'].map(format) Out[122]:  Utah       1.28 Ohio      -1.55 Texas      0.20 Oregon    -0.31 Name: e, dtype: object 

Summing up, apply works on a row / column basis of a DataFrame, applymap works element-wise on a DataFrame, and map works element-wise on a Series.

like image 109
jeremiahbuddha Avatar answered Oct 21 '22 09:10

jeremiahbuddha


Comparing map, applymap and apply: Context Matters

First major difference: DEFINITION

  • map is defined on Series ONLY
  • applymap is defined on DataFrames ONLY
  • apply is defined on BOTH

Second major difference: INPUT ARGUMENT

  • map accepts dicts, Series, or callable
  • applymap and apply accept callables only

Third major difference: BEHAVIOR

  • map is elementwise for Series
  • applymap is elementwise for DataFrames
  • apply also works elementwise but is suited to more complex operations and aggregation. The behaviour and return value depends on the function.

Fourth major difference (the most important one): USE CASE

  • map is meant for mapping values from one domain to another, so is optimised for performance (e.g., df['A'].map({1:'a', 2:'b', 3:'c'}))
  • applymap is good for elementwise transformations across multiple rows/columns (e.g., df[['A', 'B', 'C']].applymap(str.strip))
  • apply is for applying any function that cannot be vectorised (e.g., df['sentences'].apply(nltk.sent_tokenize)).

Also see When should I (not) want to use pandas apply() in my code? for a writeup I made a while back on the most appropriate scenarios for using apply (note that there aren't many, but there are a few— apply is generally slow).


Summarising

enter image description here

Footnotes

  1. map when passed a dictionary/Series will map elements based on the keys in that dictionary/Series. Missing values will be recorded as NaN in the output.

  2. applymap in more recent versions has been optimised for some operations. You will find applymap slightly faster than apply in some cases. My suggestion is to test them both and use whatever works better.

  3. map is optimised for elementwise mappings and transformation. Operations that involve dictionaries or Series will enable pandas to use faster code paths for better performance.

  4. Series.apply returns a scalar for aggregating operations, Series otherwise. Similarly for DataFrame.apply. Note that apply also has fastpaths when called with certain NumPy functions such as mean, sum, etc.

like image 36
cs95 Avatar answered Oct 21 '22 08:10

cs95