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

16
Series.map() 是将 Series 的值映射为输入对应项的函数(可以是字典、Series 或函数)。 Series.apply() 则是在 Series 值上调用函数。它可以是 ufunc(适用于整个 Series 的 NumPy 函数),也可以是仅适用于单个值的 Python 函数。
看起来,apply() 能够做到大多数 map() 所能做到的,向量化标量函数并将向量化操作应用于它们。同时,map() 允许在空值处理方面有一定的控制。除了与 Python 的 apply()map() 函数历史类比之外,在一般使用中是否有原因优先考虑其中一个?为什么不将这些函数合并呢?

3
据我所知,Series.map(func) 无法向 func 传递额外的参数。当您使用 Series.apply(func) 时,您可以使用 sr.apply(func, convert_dtype=True, arg2='foo', arg3=True) 的方式将任何关键字参数传递给 func;Series.apply() 不识别的关键字参数将被传递给 func,在本例中为 arg2='foo' 和 arg3=True。 - lineil
1
@xg.plt.py,与其他问题的背景不同,这里涉及到数据框而不是系列对象(因此在这种情况下相似性更加深刻)。 - benjimin
1个回答

6
区别微妙:

pandas.Series.map会用传入map的值替换Series的值。

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

区别在于你可以传什么给这些方法:

  • 都可以接收一个函数: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  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接