【发布时间】: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