熊猫分组法,选择3个具有最大值的元素,并取每个组的平均值

时间:2019-12-16 06:20:07

标签: python pandas pandas-groupby

我有一些DataFrame:

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

这是不正确的。我在这里想念的是什么?

1 个答案:

答案 0 :(得分:2)

我认为您可以将值转换为负值或更改仓位顺序,请检查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