python - Pandas按B列排序的A列排序排名
问题描述
目前我有以下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 的顺序排序。
解决方案
map
由sort_values
with创建的字典用于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))
推荐阅读
- amazon-dynamodb - DynamoDB 中的 `BatchWriteItem` API 的“16 MB 数据限制”实际上是什么?
- python - 是否有任何解决方案可以在 selenium Python 和使用 chromedriver 的无头浏览器中捕获具有不同 URL 的屏幕截图?
- javascript - event.stopPropagation() 在 react 17.0.1 中没有按预期工作?
- amazon-web-services - 当 IAM 用户在多个组中时,如何协调权限?
- android - 无法在 Flutter 中集成 Google 移动广告
- asp.net-core - PageModel(razor pages) 是如何处理的?
- python - 如何使用对话处理程序在 Python 中获取用户输入(python-telegram-bot)
- gif - 保存 GIF 并保留路径 - 有可能吗?
- javascript - 即使关闭,音频也会自动播放
- c - 将数据添加到文件 C 中的行尾(不使用第二个文件)