Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas Groupby:如何使用两个lambda函数?_Python_Pandas_Pandas Groupby - Fatal编程技术网

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

Python Pandas Groupby:如何使用两个lambda函数?,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我现在可以在熊猫身上做以下事情,但我从未来警告中得到了严厉的批评: 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) })

我现在可以在熊猫身上做以下事情,但我从未来警告中得到了严厉的批评:

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函数:

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
])
这引发了:

SpecificationError: Function names must be unique, found multiple named <lambda>
规范错误:函数名称必须唯一,找到多个命名的
我似乎能做到这一点的唯一方法(不忽略警告,我可能应该这么做)是采用如下详细过程

  • 使用一个lambda函数(第25百分位)定义我的DF,以及我需要的所有其他内容(最小值、最大值等)
  • 重命名cols以除去多重索引
  • 创建另一个DF,进行另一个分组,这次使用我想要的另一列(第75百分位)
  • 再次重命名cols(感谢MultiIndex!)
  • 连接回索引上的原始DF
  • 这里有我遗漏的东西吗?当然,有一种更好的方法来实现我想象中的非常常见的事情(使用两个不可直接从numpy导入的聚合)。

    这是一种,使用:


    尝试以下小技巧:

    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'
    

    然而,这是另一种类似于的方法,它允许您创建任意数量的lambda函数。所以,如果我们想让每一个百分之十的人都做如下的事情

    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_列表
    传递到
    groupby.agg()
    或附加其他函数列表,例如,
    lambda_列表+[np.mean,np.min,…]

    如果您只需要5个不同的百分位数,那么您可以更改
    n\u percentile\u group=5


    最终,我不确定这是一种健壮的还是好的方法——使用可变数量的lambda——但因为它似乎是我知道的唯一方法。欢迎对此发表评论。

    问题在于结果列名

    另一种选择:

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

    一个函数的可能副本是一个函数。
    lambda
    表达式只是创建
    function
    @chepner类型值的一种方法,如果我不清楚的话,很抱歉。我不关心函数是如何定义的,lambda表达式似乎适用于这个确切的用例,所以我有点困惑它为什么不起作用。lambda表达式用于将匿名函数作为参数传递给函数,或者可能作为映射中键的值。如果您只是想将其分配给一个名称,您也可以使用
    def
    语句。只需使用
    def percentile_25(x):返回np.percentile(x,25)
    。这里没有理由使用
    lambda
    表达式。@chepner,我使用了它,因为OP问:
    “如何使用两个lambda函数?”
    我在想类似的事情,我不知道如何构建函数——我一直使用lambda函数。这是一个很好的答案。我还建议使用
    functools将它们定义为partial。partial
    我更喜欢命名函数而不是lambda,因为合适的函数名可以避免在以后(传递多个函数时)在数据帧上调用
    .rename()
    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}
    })