【问题标题】:Use apply() with Pandas Series将 apply() 与 Pandas 系列一起使用
【发布时间】:2016-09-18 03:45:21
【问题描述】:

我有以下代码:

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 类型,并且该系列中的每个值都是浮点数,而浮点数没有 min/max 属性。

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

【问题讨论】:

  • 在这种情况下,您可以通过f(frame['d'])直接在Series上运行f

标签: python pandas lambda


【解决方案1】:

问题是 .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

ETA:实际上,即使是整个DataFrame,在这种情况下你也确实不需要 apply,而且肯定会比以下慢:

In [19]: frame.max() - frame.min()
Out[19]: 
b    3.337040
d    2.332124
e    2.224037
dtype: float64

【讨论】:

    猜你喜欢
    • 2022-11-14
    • 2016-05-21
    • 2017-10-25
    • 2017-01-27
    • 1970-01-01
    • 2018-11-22
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多