使用带有Pandas系列的apply()

时间:2016-09-18 03:45:22

标签: python pandas lambda

我有以下代码:

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应用于特定列,因此我只想将lambda应用于'd'列。所以这就是我做的事情

frame['d'].apply(f)

虽然导致错误:     AttributeError:'float'对象没有属性'max'

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

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

我尝试调试它。似乎frame ['d']是Series类型,本系列中的每个值都是float,float没有min / max属性。

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

1 个答案:

答案 0 :(得分:2)

系列作品元素上的问题是.applyDataFrame问题是按行按行 EM>。如果您真的想以这种方式使用.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