Difference between map, applymap and apply methods in Pandas

前端 未结 10 1647
刺人心
刺人心 2020-11-22 03:00

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

相关标签:
10条回答
  • 2020-11-22 03:17

    Probably simplest explanation the difference between apply and applymap:

    apply takes the whole column as a parameter and then assign the result to this column

    applymap takes the separate cell value as a parameter and assign the result back to this cell.

    NB If apply returns the single value you will have this value instead of the column after assigning and eventually will have just a row instead of matrix.

    0 讨论(0)
  • 2020-11-22 03:23

    FOMO:

    The following example shows apply and applymap applied to a DataFrame.

    map function is something you do apply on Series only. You cannot apply map on DataFrame.

    The thing to remember is that apply can do anything applymap can, but apply has eXtra options.

    The X factor options are: axis and result_type where result_type only works when axis=1 (for columns).

    df = DataFrame(1, columns=list('abc'),
                      index=list('1234'))
    print(df)
    
    f = lambda x: np.log(x)
    print(df.applymap(f)) # apply to the whole dataframe
    print(np.log(df)) # applied to the whole dataframe
    print(df.applymap(np.sum)) # reducing can be applied for rows only
    
    # apply can take different options (vs. applymap cannot)
    print(df.apply(f)) # same as applymap
    print(df.apply(sum, axis=1))  # reducing example
    print(df.apply(np.log, axis=1)) # cannot reduce
    print(df.apply(lambda x: [1, 2, 3], axis=1, result_type='expand')) # expand result
    

    As a sidenote, Series map function, should not be confused with the Python map function.

    The first one is applied on Series, to map the values, and the second one to every item of an iterable.


    Lastly don't confuse the dataframe apply method with groupby apply method.

    0 讨论(0)
  • 2020-11-22 03:24

    Quick Summary

    • DataFrame.apply operates on entire rows or columns at a time.

    • DataFrame.applymap, Series.apply, and Series.map operate on one element at time.

    Series.apply and Series.map are similar and often interchangeable. Some of their slight differences are discussed in osa's answer below.

    0 讨论(0)
  • 2020-11-22 03:25

    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.

    0 讨论(0)
提交回复
热议问题