微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

如果我理解你的问题是正确的,你可以使用自定义函数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

解决方法

假设我有一个数据框df

df = pd.DataFrame({'group_id' : [1,1,2,3,3],'amount'  : [2,4,5,5],'x':[2,8,6,9,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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。