2016-09-18 187 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