首页 > 解决方案 > 熊猫 - 按出现顺序排列

问题描述

我有一个熊猫数据框:

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

从上面的示例中,您可以看到用户aia 的第一次出现被分配了排名 1,第二次出现被分配了排名 2。

我一直在尝试 pandasrank功能,但它没有帮助:

df["rank"] = df.user.rank(method='dense')

提前致谢。

标签: pandaspandas-groupby

解决方案


这基本上是一个孤岛和差距问题。

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

编辑:如果你想按多列分组(例如,usercity):

cols = ['user', 'city']
df['change'] = np.any(df[cols] != df[cols].shift(), axis=1)
df['rank'] = df.groupby(cols)['change'].cumsum().astype('int')

推荐阅读