2016-09-06 11 views
5

mam do czynienia z pandy dataframe i mają szkielet tak:Pandy CIĘŻKIEJ RANK

Year Value 
2012 10 
2013 20 
2013 25 
2014 30 

Chcę złożyć equialent do DENSE_RANK() w funkcji (zlecenia przez rok). aby utworzyć dodatkową kolumnę:

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

Jak to zrobić w pandach?

Dzięki!

Odpowiedz

6

Zastosowanie pd.Series.rank z method='dense'

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

df 

enter image description here

4

Możesz przekonwertować rok na kategorie, a następnie wziąć ich kody (dodając jedną, ponieważ są zerowane i chcesz, aby początkowa wartość zaczynała się od jednej na twój przykład).

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

Najszybszy roztworu jest factorize:

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

taktowanie:

#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 
+0

Zauważ, że będziesz chciał użyć 'sort = True' w wywołaniu' factorize', co wpłynie również na twoje taktowanie (w moim losowo wygenerowanym 3M dużej liczbowej df, metoda 1, tj. Przy użyciu '' metoda rank'owa okazuje się najszybsza). Powodem, dla którego założyłeś, że działa, jest to, że elementy, które nie zostały zduplikowane, zostały już posortowane. –

+0

Tak, ale zależy to od tego, czy dane są sortowane czy nie. W próbce są sortowane, więc nie jest to konieczne. – jezrael

+0

Rzeczywiście, i to właśnie powiedziałem. Ponieważ jest posortowana, czynnik będzie szybszy. Ogólnie rzecz biorąc, dane nie są sortowane, a więc rozkładane, a ranking zwraca różne odpowiedzi. Dodałem komentarz jako ostrzeżenie dla przyszłych czytelników, którzy ślepo przejmują rozwiązania bez sprawdzania warunków, w których zakłada się, że działają. –