通过groupby,选择3个值最大的元素,取每组的平均值

2024-04-20 09:35:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据帧:

df = pd.DataFrame({'columnA': ['apple', 'apple', 'apple', 'apple', 'orange', 'orange', 'orange', 'orange'], 'columnB': [0.10, -0.15, 0.25, -0.55, 0.50, -0.51, 0.70, 0.90]})

    columnA columnB
0   apple   0.10
1   apple   -0.15
2   apple   0.25
3   apple   -0.55
4   orange  0.50
5   orange  -0.51
6   orange  0.70
7   orange  0.90

我想按columnA对数据进行分组,并取columnB中具有最大值(绝对值)的3行的平均值。你知道吗

我尝试的第一件事是:

df.reindex(df['columnB'].abs().sort_values(ascending=False).index).groupby('columnA').head(3).groupby('columnA')[['columnB']].mean().reset_index()


columnA columnB
0   apple   -0.150000
1   orange  0.363333

这看起来是正确的,但我想尝试简化一下:

df.iloc[df['columnB'].abs().argsort()].groupby('columnA').head(3).groupby('columnA')[['columnB']].mean().reset_index()

    columnA columnB
0   apple   0.066667
1   orange  0.230000

这是不对的。我错过了什么?你知道吗


Tags: 数据appledataframedfindexabsmeanhead
1条回答
网友
1楼 · 发布于 2024-04-20 09:35:16

我认为您可以将值转换为负数或更改位置顺序,请检查this

df1 = (df.iloc[(-df['columnB'].abs()).argsort()]
          .groupby('columnA')['columnB'].apply(lambda x: x.head(3).mean())
          .reset_index())
print (df1)
  columnA   columnB
0   apple -0.150000
1  orange  0.363333

df1 = (df.iloc[df['columnB'].abs().argsort()[::-1]]
          .groupby('columnA')['columnB'].apply(lambda x: x.head(3).mean())
          .reset_index())
print (df1)
  columnA   columnB
0   apple -0.150000
1  orange  0.363333

相关问题 更多 >