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