[英]Pandas DENSE RANK
我正在處理熊貓數據框並有一個這樣的框架:
Year Value
2012 10
2013 20
2013 25
2014 30
我想使 DENSE_RANK() over (order by year) 函數等效。 制作一個這樣的附加列:
Year Value Rank
2012 10 1
2013 20 2
2013 25 2
2014 30 3
如何在熊貓中完成?
謝謝!
最快的解決方案是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
您可以將年份轉換為分類,然后獲取它們的代碼(添加 1,因為它們的索引為零,並且您希望每個示例的初始值都以 1 開頭)。
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
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.