我有一些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
这是不正确的。我在这里想念的是什么?
答案 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