Панды быстрее, чем Argsort для ранжирования в подмножестве данных - PullRequest
0 голосов
/ 16 мая 2018

У меня есть этот фрейм данных:

user1    user2   quantity
--------------------------
Alice    Carol     10
Alice    Bob       5
Bob      Dan       2
Carol    Eve       7
Carol    Dan      100

Я хочу ранжировать каждую строку в порядке убывания, используя количество, НО по пользователю 1. Пример:

user1    user2   quantity   order
----------------------------------
Alice    Carol     10       1
Alice    Bob       5        2
Bob      Dan       2        1
Carol    Eve       7        2
Carol    Dan      100       1

В настоящее времямой код выглядит следующим образом:

users = df['user1'].unique()
for user in users:
    cond = (df['user1'] == user)
    sort_ser = df[cond]['quantity'].values.argsort()[::-1] # descending
    df.loc[cond, 'order'] = sort_ser + 1

Это работает - для небольших кадров данных.Но это медленно, если это для больших.Я думаю, это потому, что (1) я в основном запускаю его для каждого пользователя, и (2) происходит несколько сортировок.Есть ли более быстрый способ сделать это?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

С некоторыми Numpy

a = np.lexsort([-df.quantity, df.user1])
u, idx, inv = np.unique(df.user1, return_index=True, return_inverse=True)

df.assign(order=a - idx.repeat(np.bincount(inv)) + 1)

   user1  user2  quantity  order
0  Alice  Carol        10      1
1  Alice    Bob         5      2
2    Bob    Dan         2      1
3  Carol    Eve         7      2
4  Carol    Dan       100      1
0 голосов
/ 16 мая 2018

Использование:

df['order'] = df.groupby('user1')['quantity'].rank(ascending=False).astype(int)

Вывод:

   user1  user2  quantity  order
0  Alice  Carol        10      1
1  Alice    Bob         5      2
2    Bob    Dan         2      1
3  Carol    Eve         7      2
4  Carol    Dan       100      1

Подробности.

df.groupby('user1')['quantity'].rank(ascending=False)

Вывод:

0    1.0
1    2.0
2    1.0
3    2.0
4    1.0
Name: quantity, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...