簡體   English   中英

熊貓密集排名

[英]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

如何在熊貓中完成?

謝謝!

使用pd.Series.rankmethod='dense'

df['Rank'] = df.Year.rank(method='dense').astype(int)

df

在此處輸入圖片說明

最快的解決方案是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM