python 中命名的 lambda 函数,用于 pandas 的 agg 函数

Named lambda function in python to be used in pandas' agg function

提问人:Amin Ba 提问时间:6/1/2021 最后编辑:Amin Ba 更新时间:3/6/2023 访问量:467

问:

代码如下

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 函数,以便将名称替换为 sth 有意义?<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    |
Python 熊猫 Lambda

评论

5赞 Erfan 6/1/2021
第二种选择有什么问题?这似乎是一个很好的解决方案
0赞 Amin Ba 6/1/2021
第二种解决方案(在外部定义函数)有效,但我对函数的功能感到好奇,并试图找到一种保持简洁的方法,并找到一种方法在那里定义它并且仍然有一个函数名称
0赞 Erfan 6/1/2021
根据定义,Lambda 函数是匿名函数。你可以做一些丑陋的事情,比如df.index.str.replace("<lambda>", "pct30")
0赞 Amin Ba 6/1/2021
@Erfan它在创建 df 后对其进行了操作。我正在寻找 sth 简单的立即完成。看看我的伪代码
0赞 Carcigenicate 6/1/2021
这是一个可怕的想法,但只是为了解决这个问题,那么可能会起作用。def named_anon(name, func): setattr(func, "__name__", name); return funcdf[['B', 'C']].agg([min, named_anon("pct30", lambda x: x.quantile(0.3), max)])

答:

0赞 cautree 3/6/2023 #1

首先定义一个 lambda 函数,然后使用 _ name _ enter image description here

评论

0赞 Andreas Sabelfeld 3/6/2023
补充一点:通常,将 lambda 函数分配给变量不是一个好做法。相反,您应该像以前一样创建一个函数。但我认为你不应该严格遵循这些好的做法,使用一些读起来感觉好的东西。在这种情况下,我发现一个更容易看的功能。
0赞 chepner 3/6/2023
这样做是没有意义的,而不是简单地使用语句来定义 ,这将自动设置。defquantile30__name__
4赞 chepner 3/6/2023
另外,不要发布代码图像;将代码发布为文本。