Python Pandas groupby.rank by绝对值

Python Pandas groupby.rank by绝对值,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一些数据帧: df = pd.DataFrame({'columnA': ['apple', 'apple', 'apple', 'orange', 'orange', 'orange'], 'columnB': [0.10, -0.15, 0.25, 0.50, -0.51, 0.70]}) columnA columnB 0 apple 0.10 1 apple -0.15 2 apple 0.25 3 orange 0.50 4 orange -

我有一些数据帧:

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


columnA columnB
0   apple   0.10
1   apple   -0.15
2   apple   0.25
3   orange  0.50
4   orange  -0.51
5   orange  0.70
我试图用
列b
的绝对值对
列a
中的每个组成员进行排序

df['rank'] = df.reindex(df['columnB'].abs().sort_values(ascending=False).index).groupby('columnA')['columnB'].rank(ascending=False)


columnA columnB rank
0   apple   0.10    2.0
1   apple   -0.15   3.0
2   apple   0.25    1.0
3   orange  0.50    2.0
4   orange  -0.51   3.0
5   orange  0.70    1.0

但是上面的排名并不是我想要达到的绝对值

IIUC,使用
pandas.Series.abs

df['rank'] = df['columnB'].abs().groupby(df['columnA']).rank(ascending=False)
print(df)
输出:

  columnA  columnB  rank
0   apple     0.10   3.0
1   apple    -0.15   2.0
2   apple     0.25   1.0
3  orange     0.50   3.0
4  orange    -0.51   2.0
5  orange     0.70   1.0

这里有一个简洁的单行线,可以让您获得想要的结果:

df['rank'] = df.groupby('columnA',as_index=False)['columnB'].apply(lambda s: s.abs().rank(ascending=False)).values
注意,
abs
不能直接应用于groupby对象,而只能应用于series或dataframe。此处的
lambda
方法允许您直接在要排序的所需范围的
组上计算
abs