使用适用于()与熊猫系列
问题描述:
我有下面的代码:使用适用于()与熊猫系列
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'?
答
的问题是.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
在这种情况下,你可以直接运行'f'该系列通过'f(frame ['d'])' –