Pandas Series.apply() 和 Series.map() 有啥区别? [复制]

Posted

技术标签:

【中文标题】Pandas Series.apply() 和 Series.map() 有啥区别? [复制]【英文标题】:What is the difference between Pandas Series.apply() and Series.map()? [duplicate]Pandas Series.apply() 和 Series.map() 有什么区别? [复制] 【发布时间】:2016-11-11 14:59:54 【问题描述】: Series.map():

使用输入对应关系映射 Series 的值(可以是 dict、Series 或函数)

Series.apply()

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

apply() 似乎几乎完成了map() 所做的所有事情,在应用矢量化操作的同时矢量化标量函数。同时map() 允许对空值处理进行一定程度的控制。除了与 Python 的 apply()map() 函数的历史类比之外,在一般使用中是否有理由更喜欢其中一个?为什么不把这些功能组合起来呢?

【问题讨论】:

afaik Series.map(func) 无法将其他参数传递给 func。当您使用 Series.apply(func) 时,您可以执行 sr.apply(func, convert_dtype=True, arg2='foo', arg3=True),并且 Series.apply() 无法识别的任何关键字参数都是传递给 func,在本例中为 arg2='foo' 和 arg3=True。 @xg.plt.py 另一个问题的上下文是数据帧而不是系列对象(因此在这种情况下相似性更深) 【参考方案1】:

区别很微妙:

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  

【讨论】:

以上是关于Pandas Series.apply() 和 Series.map() 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python pandas:将带有参数的函数应用于系列

Series.map 和 Series.apply 之间的区别 [重复]

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

pandas 学习 第4篇:序列的处理(应用聚合转换映射分组滚动扩展指数加权移动平均)

Spark MLlib 中的列转换

Pandas之Series和Dataframe