我有一些DataFrame:
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
我试图按columnA
的绝对值对columnB
中的每个组成员进行排名。
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
但是上面的排名并不是我想要达到的绝对值。
答案 0 :(得分:1)
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
答案 1 :(得分:1)
这是一个整洁的衬纸,可为您提供所需的结果:
df['rank'] = df.groupby('columnA',as_index=False)['columnB'].apply(lambda s: s.abs().rank(ascending=False)).values
请注意,abs
不能直接应用于groupby对象,而只能应用于序列或数据帧。这里的lambda
方法允许您直接在要排序的期望范围的abs
上计算group_df
。