0

我有一个结构如下的熊猫数据框:

data = DataFrame({'Cat1':['A', 'B', 'B', 'C'], 'Cat2': ['X', 'Y', 'Z', 'X'], 'Counter': [0, 4, 1, 5]})

现在我想添加一个单独的列,按 Cat1 排名(所以在这种情况下:1、3、2、4 作为新列)。我的第一次尝试是:

data['ranking'] = data['ranking'] + data[data['Cat1'] == 'A']['Counter'].rank(ascending=0).fillna(0)

但是,当我添加第二个类别(data['Cat1']=='B' 作为条件)时,它会覆盖现有值。这是我所期望的,因为据我所知,我必须使用 .add() 。但是,以下脚本也会发生同样的情况:

data['ranking'].add(data[data['Cat1']=='A']['Counter'].rank(ascending=0))

还使用 NA 覆盖 Cat1==B 的所有值。我怎样才能避免这种情况?

提前致谢!

-----------------------编辑!!------------------

假设这是我的桌子:

在此处输入图像描述

普通排名会给我从 1 到 12 的所有数字的排名。现在我需要的是基于类别的排名,并作为原始 python DataFrame 中的附加列。

因此,最后一列应该是:2(a 的第二个值)3(a 的第三个值)1(a 的第一个值)1(b 的第一个值)1(第一个c) 的值 5 2 ...

4

1 回答 1

2

我不确定我是否正确理解了您的问题;也许下面的这个有效?

data['Cat1'][data['Counter'].rank(ascending=0) - 1]

--编辑--

如评论中所示,我的解决方案是

data['ranking'] = data.groupby('Cat1')['Counter'].rank(ascending=0)

我想不出别的了,抱歉。也许其他人会有不同的看法..

于 2013-01-29T15:19:02.260 回答