2016-09-06 5 views
5

Я имею дело с пандами dataframe и имеют кадр, как это:Панды DENSE RANK

Year Value 
2012 10 
2013 20 
2013 25 
2014 30 

Я хочу сделать equialent к DENSE_RANK() над функцией (порядка в год). чтобы сделать дополнительную колонку следующим образом:

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

Как это сделать в пандах?

Спасибо!

ответ

6

Использование pd.Series.rank с method='dense'

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

df 

enter image description here

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

самым быстрым решением является factorize:

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

Timings:

#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

Обратите внимание, что вы захотите использовать 'sort = True' в вызове' factorize', что также повлияет на ваши тайминги (в моем случайно генерируемом 3M большом числовом df, методе 1, то есть используя ' ранг' оказывается самым быстрым). Причина, по которой вы предполагали, что это работает, состоит в том, что не дублированные элементы массива уже отсортированы. –

+0

Да, но это зависит от того, сортируются данные или нет. В образце сортируются, поэтому не нужны. – jezrael

+0

Действительно, и это то, что я сказал. Поскольку он отсортирован, факторизация будет быстрее. В общем случае данные не сортируются, поэтому факторизация и ранжирование возвращают разные ответы. Я добавил комментарий как предупреждение будущим читателям, которые слепо принимают решения, не проверяя условия, при которых они предполагаются работать. –

Смежные вопросы