使用 Pandas Series 的 apply() 函数

3
我有以下代码:
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知识有限,所以很难做到这一点。如何仅对列“d”应用lambda函数?

2
在这种情况下,您可以通过在 Series 上直接运行 f(frame['d']) 来直接运行 f - Alex Riina
1个回答

2
问题在于对于Series来说,.apply是逐个元素地处理的,而对于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
预计时间:实际上,在这种情况下,即使是整个DataFrame,你也不需要使用apply函数,而且以下方法肯定比apply更快:
In [19]: frame.max() - frame.min()
Out[19]: 
b    3.337040
d    2.332124
e    2.224037
dtype: float64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接