我正在处理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
如何在熊猫中完成?
谢谢!
答案 0 :(得分:9)
答案 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