Pandas Groupby:如何使用两个lambda函数?

时间:2017-10-18 15:30:48

标签: python pandas pandas-groupby

我现在可以在Pandas中做以下事情,但是我从FutureWarning那里得到一个严厉的手指摇摆不定:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: true

以下引发错误,因为我有两个lambda函数:

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)
})

这引发:

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

df = diffs[["User Installs", "rank"]].dropna()
grpd = df.groupby("shopping_rank").agg([
    np.mean, np.median, np.min, np.max, 
    percentile_25, percentile_75
])

我似乎能够做到这一点的唯一方法(不要忽略警告,我应该这样做)是一个精心设计的过程,如下所示

  1. 使用一个lambda函数(第25个百分位数)定义我的DF,以及我需要的所有其他内容(min,max等)
  2. 重命名cols以摆脱MultiIndex
  3. 创建另一个DF,进行另一个分组,这次是我想要的其他列(第75个百分点)
  4. 再次重命名cols(感谢MultiIndex!)
  5. 加入指数的原始DF
  6. 我有什么东西在这里失踪吗?当然,有一个更好的方法来做我想象的很常见的事情(使用两个不能直接从numpy导入的聚合)。

4 个答案:

答案 0 :(得分:5)

它是known bug,使用:

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

答案 1 :(得分:4)

尝试以下小黑客:

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'

答案 2 :(得分:1)

问题是结果列名称。

替代方法:

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

grouped = df.groupby("field1")
grouped.agg({
    'field2': {'percentile_25': percentile_25, 'percentile_75': percentile_75}
})

答案 3 :(得分:0)

这是另一种类似于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它似乎是我所知道的唯一方式。对此非常欢迎。