假设我有一个数据框df:
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 种聚合方法中的每一种。
group_id
x
amount
我在这里看到了很多问题,它们在不处理多个最大值的情况下解决了问题。例如,我可以这样做:
df.sort_values('amount', ascending=False).groupby('group_id').first().x
但我不知道如何实现不同的聚合方法。
如果我理解你的问题是正确的,你可以使用自定义函数GroupBy.apply:
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():
.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