pandas - 熊猫 - 按出现顺序排列
问题描述
我有一个熊猫数据框:
user, cat
---------
'a', 1
'a', 2
'b', 1.2
'b', 2.1
'a', 0.2
'a', 1.9
'b', 2.1
保持顺序不变,我怎样才能对每组连续记录user
分配一个新的排名?user
所以,我正在寻找的输出是:
user, cat, rank
---------------
'a', 1, 1
'a', 2, 1
'b', 1.2, 1
'b', 2.1, 1
'a', 0.2, 2
'a', 1.9, 2
'b', 2.1, 2
从上面的示例中,您可以看到用户a
ia 的第一次出现被分配了排名 1,第二次出现被分配了排名 2。
我一直在尝试 pandasrank
功能,但它没有帮助:
df["rank"] = df.user.rank(method='dense')
提前致谢。
解决方案
这基本上是一个孤岛和差距问题。
df['change'] = df['user'] != df['user'].shift()
df['rank'] = df.groupby('user')['change'].cumsum().astype('int')
结果:
user cat change rank
0 'a' 1.0 True 1
1 'a' 2.0 False 1
2 'b' 1.2 True 1
3 'b' 2.1 False 1
4 'a' 0.2 True 2
5 'a' 1.9 False 2
6 'b' 2.1 True 2
编辑:如果你想按多列分组(例如,user
和city
):
cols = ['user', 'city']
df['change'] = np.any(df[cols] != df[cols].shift(), axis=1)
df['rank'] = df.groupby(cols)['change'].cumsum().astype('int')
推荐阅读
- java - 如何反转或补充Java中返回布尔值的函数的输出
- r - 通过将数据集中的所有变量保存在 r 中来计算平均值
- java - 清理缓存时片段重复
- laravel - 使用 PHPUnit 通过 Github 操作在主机应用程序中测试 Laravel 包?
- macos - 签署、公证、强化等 macOS 命令行二进制文件?
- c# - 以动画方式绘制线条
- azure - 如何查找 Azure blob 容器中的对象数量 - 存档层
- python - 如何有效地比较 2 个列表并从 1 中删除重复项?
- swift - iOS 响应者链和事件
- pentaho - Pentaho 勺子 + 重做输出文件中的字段外壳