Pandas Series.apply()和Series.map()有什么区别?

时间:2016-07-08 23:45:58

标签: python numpy vectorization

Series.map()
  

使用输入对应关系(可以是字典,系列或函数)映射系列的值

Series.apply()
  

调用Series的值函数。可以是ufunc(适用于整个系列的NumPy函数)或仅适用于单个值的Python函数

apply()似乎它主要完成map()所做的一切,在应用矢量化操作时对矢量化标量函数进行矢量化。同时map()允许对空值处理进行一定程度的控制。除了Python的apply()map()函数的历史类比之外,是否有理由在一般情况下优先选择其中一个?为什么这些功能不能合并?

1 个答案:

答案 0 :(得分:2)

差别很小:

pandas.Series.map将用您传递到map中的值替代系列的值。

pandas.Series.apply将对系列的值应用函数(可能带有参数)。

区别在于您可以传递给方法

  • mapapply都可以接收功能:
s = pd.Series([1, 2, 3, 4])

def square(x):
     return x**2

s.map(square) 

0    1
1    2
2    3
3    4
dtype: int64

s.apply(square) 

0    1
1    2
2    3
3    4
dtype: int64
  • 但是,您传递给map的函数不能有多个参数(它将输出一个ValueError):
def power(x, p):
    return x**p

s.apply(power, p=3)

0     1
1     8
2    27
3    64
dtype: int64


s.map(power,3)
---------------------------------------------------------------------------
ValueError  

  • map可以接收字典(甚至是pd.Series,在这种情况下,它将使用索引作为键),而apply则不能(将输出TypeError
dic = {1: 5, 2: 4}

s.map(dic)

0    5.0
1    4.0
2    NaN
3    NaN
dtype: float64

s.apply(dic)
---------------------------------------------------------------------------
TypeError  


s.map(s)

0    2.0
1    3.0
2    4.0
3    NaN
dtype: float64


s.apply(s)

---------------------------------------------------------------------------
TypeError