Панды отсортированы ранжирование столбца A отсортировано по столбцу B - PullRequest
0 голосов
/ 22 ноября 2018

В настоящее время у меня есть следующий код Python

forumposts = pd.DataFrame({'UserId': [1,1,2,3,2,1,3], 'FirstPostDate': [2018,2018,2017,2019,2017,2018,2019], 'PostDate': [201801,201802,201701,201901,201801,201803,201902]})

data = forumposts.groupby(['UserId', 'PostDate','FirstPostDate']).size().reset_index()

rankedUserIdByFirstPostDate = data.groupby(['UserId', 'FirstPostDate']).size().reset_index().sort_values('FirstPostDate').reset_index(drop=True).reset_index()

data.loc[:,'Rank'] = data.merge(rankedUserIdByFirstPostDate , how='left', on='UserId')['index'].values

Код работает, как задумано, но это сложно, есть ли способ сделать это, как панды?Намерение следующее:

Создать плотный ранг по столбцу UserId, отсортированному по FirstPostDate, так что пользователь с самой ранней публикацией получает ранг 0, а пользователь со второй самой ранней первой публикацией получает ранг.1 и т. Д.

Использование forumposts.UserId.rank(method='dense') дает мне рейтинг, но сортируется по порядку идентификатора пользователя.

1 Ответ

0 голосов
/ 22 ноября 2018

Используйте map по словарю, созданному sort_values с drop_duplicates для заказа, упакованного с np.arange:

data = (forumposts.groupby(['UserId', 'PostDate','FirstPostDate'])
                  .size()
                  .reset_index(name='count'))

users = data.sort_values('FirstPostDate').drop_duplicates('UserId')['UserId']
d = dict(zip(users, np.arange(len(users))))
data['Rank'] = data['UserId'].map(d)
print (data)
   UserId  PostDate  FirstPostDate  count  Rank
0       1    201801           2018      1     1
1       1    201802           2018      1     1
2       1    201803           2018      1     1
3       2    201701           2017      1     0
4       2    201801           2017      1     0
5       3    201901           2019      1     2
6       3    201902           2019      1     2

Другое решение:

data['Rank'] = (data.groupby('UserId')['FirstPostDate']
                   .transform('min')
                   .rank(method='dense')
                   .sub(1)
                   .astype(int))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...