熊猫groupby.rank的绝对值

时间:2019-12-16 04:24:29

标签: python pandas pandas-groupby

我有一些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

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

2 个答案:

答案 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

相关问题