地图,applymap和apply方法在Pandas中的区别

你能告诉我什么时候使用这些vector化方法的基本例子? 我看到map是一个Series方法,而其余的是DataFrame方法。 尽pipe我对applyapply applymap方法感到困惑。 为什么我们有两种方法将函数应用于DataFrame? 再一次,说明这个用法的简单例子会很棒!

谢谢!

直接来自Wes McKinney的“ Python for Data Analysis”一书。 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]: bde 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 

许多最常见的数组统计(如sum和mean)都是DataFrame方法,所以使用apply不是必须的。

元素明智的Python函数也可以使用。 假设你想从帧中的每个浮点值计算一个格式化的string。 你可以用applymap来做到这一点:

 In [120]: format = lambda x: '%.2f' % x In [121]: frame.applymap(format) Out[121]: bde 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 

总结一下,在DataFrame的行/列基础上apply工程, applymap在DataFrame上以元素方式工作,并且按照元素方式在Series上工作。

添加到其他答案,在一个Series还有地图和申请 。

Apply可以使一个DataFrame不在一个系列中 ; 然而,地图只会在另一个系列的每个单元格中放置一个系列,这可能不是您想要的。

 In [40]: p=pd.Series([1,2,3]) In [41]: p Out[31]: 0 1 1 2 2 3 dtype: int64 In [42]: p.apply(lambda x: pd.Series([x, x])) Out[42]: 0 1 0 1 1 1 2 2 2 3 3 In [43]: p.map(lambda x: pd.Series([x, x])) Out[43]: 0 0 1 1 1 dtype: int64 1 0 2 1 2 dtype: int64 2 0 3 1 3 dtype: int64 dtype: object 

另外,如果我有一个副作用的function,如“连接到Web服务器”,我可能会使用apply只是为了清晰起见。

 series.apply(download_file_for_every_element) 

Map不仅可以使用一个function,也可以使用字典或其他系列。 假设你想操纵排列 。

采取

 1 2 3 4 5 2 1 4 5 3 

这个排列的正方形是

 1 2 3 4 5 1 2 5 3 4 

你可以使用map来计算它。 不知道自助申请是否logging在案,但在0.15.1

 In [39]: p=pd.Series([1,0,3,4,2]) In [40]: p.map(p) Out[40]: 0 0 1 1 2 4 3 2 4 3 dtype: int64 

@jeremiahbuddha提到,适用于行/列的工作,而applymap工作元素明智。 但似乎你仍然可以使用申请元素明智的计算….

  frame.apply(np.sqrt) Out[102]: bde Utah NaN 1.435159 NaN Ohio 1.098164 0.510594 0.729748 Texas NaN 0.456436 0.697337 Oregon 0.359079 NaN NaN frame.applymap(np.sqrt) Out[103]: bde Utah NaN 1.435159 NaN Ohio 1.098164 0.510594 0.729748 Texas NaN 0.456436 0.697337 Oregon 0.359079 NaN NaN 

在这些答案中有很好的信息,但是我要join我自己来清楚地总结哪些方法在数组方式和按元素方式方面都是一样的。 jeremiahbuddha主要做了这个,但没有提到Series.apply。 我没有代表评论。

  • DataFrame.apply对整个行或列进行操作。

  • DataFrame.applymapSeries.applySeries.map在一个元素上运行。

Series.applySeries.map之间有很多重叠,这意味着在大多数情况下,任何一个都可以工作。 虽然他们有一些细微的差异,其中一些在奥萨的答案中讨论过。

只是想指出,正如我一直在努力这一点

 def f(x): if x < 0: x = 0 elif x > 100000: x = 100000 return x df.applymap(f) df.describe() 

这不会修改dataframe本身,必须重新分配

 df = df.applymap(f) df.describe() 

可能最简单的解释apply和applymap之间的区别:

apply将整列作为参数,然后将结果分配给该列

applymap将单独的单元格值作为参数,并将结果返回给此单元格。

注意:如果应用返回单个值,那么在赋值之后,您将拥有该值而不是列,并且最终将只有一行而不是matrix。