【问题标题】:Named lambda function in python to be used in pandas' agg functionpython中的命名lambda函数用于pandas的agg函数
【发布时间】: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 函数,以便将名称 &lt;lambda&gt; 替换为有意义的东西?

类似于下面编写的代码(这是伪代码,不起作用):

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("&lt;lambda&gt;", "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)]) 可能会起作用。

标签: python pandas lambda


【解决方案1】:

“命名” lambda 函数的唯一其他方法如下:
它有点类似于第二个选项,但更简洁。

pct30 = lambda x: x.quantile(0.3)

df[['B', 'C']].agg([min, pct30, max])

输出相同

            B   C
min         1.0 10.0
<lambda>    2.2 22.0
max         8.0 80.0

【讨论】:

  • 但它仍然返回相同的结果。似乎我想做的事情是不可能的
猜你喜欢
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多