如何在pandas中添加排序功能?

3

我想要获取列的值的排序,并将其作为一个新列a_order添加到数据中。

例如,对于列a,数值的顺序为0.5 < 2.5 < 3.6

因此,在新建的列a_order0.5对应02.5对应13.6对应2

输入:

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'a':[0.5, 3.6, 2.5]})

输出:

     a
0  0.5
1  3.6
2  2.5

期望结果:

     a  a_order
0  0.5        0
1  3.6        2
2  2.5        1
3个回答

4
使用rank,减去1并转换为整数:
df['a_order'] = df['a'].rank(method='dense').sub(1).astype(int)
print (df)
     a  a_order
0  0.5        0
1  3.6        2
2  2.5        1

请撤销之前的编辑。实际上,这提供了一个很好的想法,如果存在重复项,用户将知道该使用什么。 - Space Impact
1
@SandeepKadapa - 我将其删除,因为它返回了错误的值,我在重复值方面犯了错误。您可以在此处进行检查。 - jezrael
我们有一个 method = 'first',它将处理排名中的重复项。请检查一下。 - Space Impact
@SandeepKadapa - 出现了问题,因为argsort返回已排序值的索引,所以在这里无法使用 :( - jezrael
我觉得你误解了我的评论。 我的意思是要使用重复数据检查此 df['a'].rank(method='first').sub(1).astype(int),因为参数 method='first' 已经处理了这个问题。 - Space Impact
1
@SandeepKadapa - 是的,我同意你的观点。我说的是argsort,而你说的是method='first' - jezrael

0

为什么不采用以下方法:

df['a_order']=df.sort_values('a').index.tolist()

'a_order'赋值为按'a'列排序后的数据框的索引


1
谢谢您的回答,但是您的解决方案并不是我所期望的。我只是想比较一列中的所有值,并将顺序作为新列。例如,如果在列a中有四个值0.5、3.6、2.5、0.0,我希望在列a_order中得到1、3、2、0 - rosefun
@rosefun 怎么回事?你能再试一次吗? - U13-Forward

0
你可以使用np.ndarray.argsort
df['a_order'] = df['a'].values.argsort()

print(df)

     a  a_order
0  0.5        0
1  3.6        2
2  2.5        1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接