问题描述
如果我理解你的问题是正确的,你可以使用自定义函数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
但我不知道如何实现不同的聚合方法。