小编典典

Pandas 按 x 分组,按 y 排序,选择 z,在多个最大值的情况下聚合

all

假设我有一个数据框df

df = pd.DataFrame({'group_id' : [1,1,1,2,2,3,3,3,3],
                   'amount'  : [2,4,5,1,2,3,5,5,5],
                   'x':[2,5,8,3,6,9,3,1,0]})

   group_id  amount  x
0         1       2  2
1         1       4  5
2         1       5  8
3         2       1  3
4         2       2  6
5         3       3  9
6         3       5  3
7         3       5  1
8         3       5  0

我想把它分组group_id,然后挑选x,对应最大的amount。我无法弄清楚的部分是如何处理多行具有最大值的情况amount。例如,上面 df 中的最后 3 行。在这种情况下,我想汇总x使用 x 的平均值、中位数或众数的值。我正在尝试获得解决方案,在该解决方案中,我可以实现这 3 种聚合方法中的每一种。

我在这里看到了很多问题,它们在不处理多个最大值的情况下解决了问题。例如,我可以这样做:

df.sort_values('amount', ascending=False).groupby('group_id').first().x

但我不知道如何实现不同的聚合方法。


阅读 77

收藏
2022-08-03

共1个答案

小编典典

如果我理解你的问题是正确的,你可以使用自定义函数GroupBy.apply

out = df.groupby("group_id").apply(
    lambda x: pd.Series(
        {
            "mean": (d := x.loc[x["amount"] == x["amount"].max(), "x"]).mean(),
            "median": d.median(),
            "mode": d.mode()[0],
        }
    )
)
print(out)

印刷:

              mean  median  mode
group_id                        
1         8.000000     8.0   8.0
2         6.000000     6.0   6.0
3         1.333333     1.0   0.0

或者.describe()

out = df.groupby("group_id").apply(
    lambda x: x.loc[x["amount"] == x["amount"].max(), "x"].describe()
)
print(out)

Prints::

x         count      mean       std  min  25%  50%  75%  max
group_id                                                    
1           1.0  8.000000       NaN  8.0  8.0  8.0  8.0  8.0
2           1.0  6.000000       NaN  6.0  6.0  6.0  6.0  6.0
3           3.0  1.333333  1.527525  0.0  0.5  1.0  2.0  3.0
2022-08-03