【发布时间】:2021-05-31 22:22:09
【问题描述】:
下面的代码
df = pd.DataFrame({
'A': ['a', 'b', 'a', 'b', 'b'],
'B': [1, 2, 3, 4, 8],
'C': [10, 20, 30, 40, 80]})
df[['B', 'C']].agg([min, lambda x: x.quantile(0.3), max])
返回:
| | B C |
| -------- | -------------- |
| min | 1.0 10.0 |
| <lambda> | 2.2 22.0 |
| max | 8.0 80.0 |
问题:*
有什么方法可以命名 lambda 函数,以便将名称 <lambda> 替换为有意义的东西?
类似于下面编写的代码(这是伪代码,不起作用):
df[['B', 'C']].agg([min, def pct30(x): return x.quantile(0.3), max])
代替:
def pct30(x):
return x.quantile(0.3)
df[['B', 'C']].agg([min, pct30, max])
返回:
| | B C |
| -------- | -------------- |
| min | 1.0 10.0 |
| pct30 | 2.2 22.0 |
| max | 8.0 80.0 |
【问题讨论】:
-
第二个选项有什么问题?这似乎是一个很好的解决方案
-
第二种解决方案(在外面定义函数)有效,但我对函数的功能很好奇,并试图找到一种方法来保持简洁并找到一种方法来定义它并且仍然有一个函数名称
-
Lambda 函数定义为匿名函数。你可以做一些丑陋的事情,比如
df.index.str.replace("<lambda>", "pct30") -
@Erfan 它在创建 df 后对其进行操作。我正在寻找可以立即完成的简单操作。看我的伪代码
-
这是一个糟糕的想法,但为了这个问题,
def named_anon(name, func): setattr(func, "__name__", name); return func,然后df[['B', 'C']].agg([min, named_anon("pct30", lambda x: x.quantile(0.3), max)])可能会起作用。