根据条件对pandas DataFrames进行排序

时间:2013-01-29 13:02:37

标签: python pandas

我有一个pandas DataFrame,其结构如下:

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)

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

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

同样覆盖Cat1 == B with NA的所有值。我怎么能避免这个?

提前致谢!

----------------------- 修改!! -------------- ----

让我们说这是我的表:

enter image description here

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

因此,最后一栏应该看起来如下: 2(排名第二的a) 3(排名第三的a) 1(排名第一的a) 1(排名第一的b) 1(排名第一的c) 五 2 ...

1 个答案:

答案 0 :(得分:2)

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

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

- 的修改 -

在评论中,我的解决方案是

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

我想不出别的,对不起。也许其他人会有不同的观点..