【问题标题】:pandas .apply of anonymous function unexpectedly returning series of function objects匿名函数的pandas .apply意外返回一系列函数对象
【发布时间】:2020-04-07 15:52:26
【问题描述】:

在阅读apply documentation 时,我尝试执行与本示例中演示的操作类似的操作(直接从链接中提取):

>>> df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])

>>> df

   A  B
0  4  9
1  4  9
2  4  9 

>>> df.apply(np.sum, axis=0)

A    12
B    27
dtype: int64

选择axis=0表示该函数应用于每一列,正如我们可以从新的行索引中看到的那样,它是先前列的名称。

但是,当我应用(我认为是)该函数的匿名版本而不是直接应用该函数时,发生了一些意外(免责声明:我知道这里没有理由使用匿名函数。我只是在试验用什么来建立我的直觉)。

这是我的功能:

>>> def my_function(a_column):
        values_in_col = list(set(a_column))
        new_strings_list = ["{}.{}".format(a_column.name,values) for values in values_in_col]
        return new_strings_list

它按我的预期工作:

>>> df

  A B
0 3 4
1 2 4
2 1 9

>>> df.apply(my_function, axis=0)

A ['A.1', 'A.2', 'A.3']
B ["B.4", "B.9"]

但如果我尝试通过 lambda 应用它,我会得到一系列函数对象:

>>> df2 = df.apply(lambda x: my_function, axis=0)
>>> df2

A    <function generate_new_col_names at 0x11938ab90>
B    <function generate_new_col_names at 0x11938ab90>
dtype: object

>>> df2[0](df["A"])
['A.1', 'A.2', 'A.3']

>>> type(df2)
<class 'pandas.core.series.Series'>

>>> type(df2[1])
<class 'function'>

所以,有几件事。

1) 当 df2[#] 的类型不是对象时,“dtype:object”是怎么回事?我认为 dtype 必须来自 pandas,而 type 必须来自 python,这可以解释这一点,but the conversion doesn't seem to hold

2) 依次传递给 lambda 的每个“x”都应该是一列,因为我的参数 axis=0,对吧?那么,为什么我得到的东西与直接插入每一列时不同呢?

>>> my_function(df.A)
['A.1', 'A.2', 'A.3']

>>> (lambda x: my_function(x))(df.A)
['A.1', 'A.2', 'A.3']

它似乎是在吐出实际函数而不是评估函数——那么输入到哪里去了?我尝试了这个实验,它似乎是在评估函数而不是返回函数对象:

>>> def my_other_func(x): # I'm just doing an external def'n to mirror what happened before
     return x + 1

>>> my_other_func(4)
5

>>> (lambda x: my_other_func(x))(4)
5

>>> test = (lambda x: my_other_func(x))(4)
>>> type(test)
int

所以看来“apply”的使用与我对之前结果的错误预期有关。

【问题讨论】:

    标签: python pandas lambda types apply


    【解决方案1】:

    没关系,我想通了。

    >>> df.apply(lambda x: my_function, axis=0)
    

    产生一系列函数对象,但是

    >>> df.apply(lambda x: my_function(x), axis=0)
    

    产生预期的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 2013-03-29
      • 2021-03-16
      • 1970-01-01
      • 2022-01-16
      • 2015-07-05
      • 1970-01-01
      相关资源
      最近更新 更多