2016-09-18 140 views
2

我有下面的代码:使用适用于()与熊猫系列

import pandas as pd 
frame = pd.DataFrame(np.random.randn(4,3), columns=list('bde'),index=['Utah','Ohio','Texas','Oregon']) 

frame 

b d e 
Utah 0.479210 0.161892 -1.315375 
Ohio -0.572543 0.080203 -0.446178 
Texas 0.052954 0.043417 0.365056 
Oregon 1.462631 0.244453 2.207720 

f = lambda x: x.max()-x.min() 
frame.apply(f) 

这导致到:

b 2.035174 
d 0.201035 
e 3.523095 
dtype: float64 

我试着去了解如何将拉姆达适用于特定列只让我只想将lambda应用于'd'列。所以这是我做过什么

frame['d'].apply(f) 

这结果虽然错误: AttributeError的:“浮动”对象有没有属性“最大”

type(frame['d']) 
pandas.core.series.Series 

frame['d'].dtype 
dtype('float64') 

我尝试调试它。似乎frame ['d']是Series的类型,并且此系列中的每个值都是一个float,而float不具有min/max属性。

我以为我只是在这里错过了一些简单的东西,但是我对Python和熊猫的有限知识给了我很大的困难。我如何才能将lambda应用于列'd'?

+2

在这种情况下,你可以直接运行'f'该系列通过'f(frame ['d'])' –

回答

1

的问题是.apply上的系列作品的elementwise,在DataFrame它的工作原理通过一系列通过行。如果你真的想用.apply这种方式,你可以子集是这样的:

In [9]: frame.loc[:,['d']] 
Out[9]: 
       d 
Utah 2.259488 
Ohio 0.458926 
Texas -0.072635 
Oregon 0.470217 

In [10]: type(frame.loc[:,['d']]) 
Out[10]: pandas.core.frame.DataFrame 

返回一个DataFrame。所以,那么你可以简单地做:

In [11]: frame.loc[:,['d']].apply(lambda x: x.max()-x.min()) 
Out[11]: 
d 2.332124 
dtype: float64 

注意,为了简便起见,你可以简单地使用frame[['d']],然而,这会更有意义:

In [12]: frame.d.max() - frame.d.min() 
Out[12]: 2.3321235565383334 

ETA:事实上,即使整个DataFrame在这种情况下,你真的不需要申请,它肯定会比以下更慢:

In [19]: frame.max() - frame.min() 
Out[19]: 
b 3.337040 
d 2.332124 
e 2.224037 
dtype: float64