PandasGroupby:如何使用两个lambda函数?

2024-04-19 12:55:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在可以在熊猫身上做以下事情,但我受到了来自未来警告的严厉指责:

grpd = df.groupby("rank").agg({
    "mean": np.mean, "meian": np.median, "min": np.min, "max": np.max, 
    "25th percentile": lambda x: np.percentile(x, 25),
    "75th percentile": lambda x: np.percentile(x, 75)
})

因为我有两个lambda函数,所以下面抛出一个错误:

^{pr2}$

这会引发:

SpecificationError: Function names must be unique, found multiple named <lambda>

我唯一能使这项工作成功的方法(不忽略警告,我可能应该这么做)是使用下面这样一个复杂的过程

  1. 用一个lambda函数定义我的DF(第25个百分位),以及我需要的其他所有东西(最小值、最大值等)
  2. 重命名cols以除去MultiIndex
  3. 创建另一个DF,进行另一个分组,这次使用我想要的另一列(第75个百分点)
  4. 再次重命名cols(谢谢MultiIndex!)在
  5. 连接回索引上的原始DF

我有什么遗漏吗?当然,有更好的方法来完成我想象中相当常见的事情(使用两个不能直接从numpy导入的聚合)。在


Tags: 方法lambda函数警告dfnpminmean
3条回答

这是另一种类似于MaxU的方法,但是它允许您创建任意数量的lambda函数。所以,如果我们想要每10个百分位可以做如下的事情

n_percentile_groups = 10
lambda_list = []

for pcntl in np.linspace(10, 100, n_percentile_groups):
    lmbd = lambda x, pcntl=pcntl: np.percentile(x, int(pcntl))
    lmbd.__name__ = 'percentile_%d' % pcntl
    lambda_list.append(lmbd)

现在将lambda_list传递给groupby.agg(),或附加其他函数列表,例如lambda_list + [np.mean, np.min, ...]。在

如果你只想要5个不同的百分位,那么你可以改变n_percentile_groups = 5。在

最终,我不确定这是一个健壮的还是好的方法-使用可变数量的lambda-但是由于groupby deprecation - 0.21这似乎是我唯一知道的方法。对此非常欢迎评论。在

它是一个known bug,使用:

def percentile_25(x): return np.percentile(x, 25)
def percentile_75(x): return np.percentile(x, 75)

尝试以下小技巧:

percentile_25 = lambda x: np.percentile(x, 25)
percentile_25.__name__ = 'percentile_25'
percentile_75 = lambda x: np.percentile(x, 75)
percentile_75.__name__ = 'percentile_75'

相关问题 更多 >