猿问

Pandas 排序 A 列排名 B 列排序

目前我有以下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,依此类推。


Usingforumposts.UserId.rank(method='dense')给了我一个排名,但它按 UserId 的顺序排序。


富国沪深
浏览 200回答 1
1回答

跃然一笑

使用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  Rank0       1    201801           2018      1     11       1    201802           2018      1     12       1    201803           2018      1     13       2    201701           2017      1     04       2    201801           2017      1     05       3    201901           2019      1     26       3    201902           2019      1     2另一种解决方案:data['Rank'] = (data.groupby('UserId')['FirstPostDate']                   .transform('min')                   .rank(method='dense')                   .sub(1)                   .astype(int))
随时随地看视频慕课网APP

相关分类

Python
我要回答