为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas 排序 A 列排名 B 列排序

Pandas 排序 A 列排名 B 列排序

富国沪深 2021-08-24 19:28:24
目前我有以下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 的顺序排序。
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

使用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))


查看完整回答
反对 回复 2021-08-24
  • 1 回答
  • 0 关注
  • 199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信