我有以下代码:
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'列?
答案 0 :(得分:2)
系列作品元素上的问题是.apply
,DataFrame
问题是按行或按行> 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