你能告诉我什么时候使用这些矢量化方法和基本例子吗?
我看到map
是一个Series
方法,而其余的是DataFrame
方法。不过,我对apply
和applymap
方法感到困惑。为什么我们有两种将函数应用于DataFrame的方法?再次,简单的例子,说明使用将是很棒的!
发布于 2019-05-25 01:26:05
第一个主要区别:DEFINITION
map
仅在系列上定义applymap
仅在DataFrames上定义apply
是在这两个第二大区别:输入参数
map
接受dict
s、Series
或可调用的applymap
和apply
只接受可调用的第三大区别:行为
map
是系列的元素级applymap
是DataFrames的元素级apply
也在元素上工作,但适合于更复杂的操作和聚合。行为和返回值取决于函数。第四大区别(最重要的):用例
map
是为了将值从一个域映射到另一个域,因此对性能进行了优化(例如,df['A'].map({1:'a', 2:'b', 3:'c'})
)。applymap
有利于跨多个行/列(例如,df[['A', 'B', 'C']].applymap(str.strip)
)的元素级转换。apply
用于应用任何不能矢量化的函数(例如,df['sentences'].apply(nltk.sent_tokenize)
)。另外,请参阅什么时候我应该(不)想使用熊猫在我的代码中应用()?中我刚才所做的关于使用apply
的最合适的场景(注意并不多,但有一些-应用通常比较慢)。
小结
脚注
map
在传递字典/系列时,将根据该字典/系列中的键映射元素。缺失的值将作为NaN记录在输出中。applymap
已经为一些操作进行了优化。在某些情况下,您会发现applymap
略快于apply
。我的建议是测试两者,并使用任何更好的工作。map
进行了元素映射和转换的优化。涉及字典或系列的操作将使熊猫能够使用更快的代码路径以获得更好的性能。Series.apply
返回用于聚合操作的标量,否则为Series。同样适用于DataFrame.apply
。请注意,apply
在使用某些NumPy函数(如mean
、sum
等)调用时也具有快速路径。发布于 2013-11-05 20:40:33
apply
在DataFrame的行/列基础上工作
applymap
在DataFrame上按元素工作
map
在系列中按元素工作
直接取自韦斯·麦金尼( Wes )的用于数据分析的Python书,pg。132 (我强烈推荐这本书):
另一个常见的操作是将一维数组上的函数应用于每列或每一行。DataFrame的apply方法正是这样做的:
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
许多最常见的数组统计数据(如求和和平均值)都是DataFrame方法,因此不必使用apply。也可以使用元素级Python函数。假设您希望从帧中的每个浮点值计算一个格式化的字符串。您可以使用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
名称applymap的原因是,Series有一个map方法,用于应用按元素划分的函数:
In [122]: frame['e'].map(format)
Out[122]:
Utah 1.28
Ohio -1.55
Texas 0.20
Oregon -0.31
Name: e, dtype: object
发布于 2016-08-11 15:20:32
快速总结
DataFrame.apply
一次对整个行或列进行操作。DataFrame.applymap
、Series.apply
和Series.map
同时对一个元素进行操作。Series.apply
和Series.map
是相似的,而且经常是可互换的。在下面的osa的回答中讨论了它们之间的一些细微差别。
https://stackoverflow.com/questions/19798153
复制相似问题