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.apply()使用输入对应关系映射 Series 的值(可以是 dict、Series 或函数)
对 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
将函数(可能带有参数)应用于系列的值。
不同之处在于你可以传递给方法
map
和apply
都可以接收函数:
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() 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Series.map 和 Series.apply 之间的区别 [重复]
pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快