熊猫DENSE排名

时间:2016-09-06 21:09:18

标签: python sql pandas

我正在处理pandas数据帧,并且有一个这样的框架:

Year Value  
2012  10
2013  20
2013  25
2014  30

我希望通过(按年份排序)功能使DENSE_RANK()等效。制作这样的附加栏目:

    Year Value Rank
    2012  10    1
    2013  20    2
    2013  25    2
    2014  30    3

如何在熊猫中完成?

谢谢!

4 个答案:

答案 0 :(得分:9)

pd.Series.rankmethod='dense'

一起使用
df['Rank'] = df.Year.rank(method='dense').astype(int)

df

enter image description here

答案 1 :(得分:5)

最快的解决方案是factorize

df['Rank'] = pd.factorize(df.Year)[0] + 1

<强>计时

#len(df)=40k
df = pd.concat([df]*10000).reset_index(drop=True)

In [13]: %timeit df['Rank'] = df.Year.rank(method='dense').astype(int)
1000 loops, best of 3: 1.55 ms per loop

In [14]: %timeit df['Rank1'] = df.Year.astype('category').cat.codes + 1
1000 loops, best of 3: 1.22 ms per loop

In [15]: %timeit df['Rank2'] = pd.factorize(df.Year)[0] + 1
1000 loops, best of 3: 737 µs per loop

答案 2 :(得分:4)

您可以将年份转换为分类,然后转换他们的代码(添加一个因为它们是零索引,并且您希望初始值以每个示例的一个开头)。

df['Rank'] = df.Year.astype('category').cat.codes + 1

>>> df
   Year  Value  Rank
0  2012     10     1
1  2013     20     2
2  2013     25     2
3  2014     30     3

答案 3 :(得分:0)

Groupby.ngroup

默认情况下将对键进行排序,因此较小的年份将被标记为较低的年份。可以设置sort=False以根据出现的顺序对组进行排名。

df['Rank'] = df.groupby('Year', sort=True).ngroup()+1

np.unique

也可以排序,因此请使用return_inverse将较小的值排名最低。

df['Rank'] = np.unique(df['Year'], return_inverse=True)[1]+1