Python 需要统一的并列排名在熊猫栏
我对熊猫还不太熟悉。我有一个如下所示的数据帧:Python 需要统一的并列排名在熊猫栏,python,pandas,Python,Pandas,我对熊猫还不太熟悉。我有一个如下所示的数据帧: In [47]: print(d1) date name sector value 0 2014-10-31 A Information Tech -3.18229 1 2014-10-31 B Industrials -52.1333 2 2014-10-31 C Consumer Discret 45.3428 3 2014-10-31 D
In [47]: print(d1)
date name sector value
0 2014-10-31 A Information Tech -3.18229
1 2014-10-31 B Industrials -52.1333
2 2014-10-31 C Consumer Discret 45.3428
3 2014-10-31 D Industrials -4.4901
4 2014-10-31 E Industrials 6.85653
5 2014-10-31 F Information Tech 4.56422
6 2014-10-31 H Information Tech 29.31419
7 2014-10-31 G Information Tech 6.52422
8 2014-10-31 I Sports 16.52422
9 2014-10-31 J Sports 2.62176
用例是,对于记录的某一天,我需要对值列进行统一排序。排名应始终介于1到6之间,与记录数无关。如果平局,我需要给出这些记录的平均排名
为简单起见,我将总的_行保持在上面的10行,实际上,每个日期的总行数都要高得多(在数千行范围内)。排名范围从1到100
输出可以如下所示:
date name sector value rank
0 2014-10-31 A Information Tech -3.18229 5
1 2014-10-31 B Industrials -52.1333 6
2 2014-10-31 C Consumer Discret 45.3428 1
3 2014-10-31 D Industrials -4.4901 5
4 2014-10-31 E Industrials 6.85653 3
5 2014-10-31 F Information Tech 4.56422 3
6 2014-10-31 H Information Tech 29.31419 1
7 2014-10-31 G Information Tech 6.52422 3
8 2014-10-31 I Sports 16.52422 2
9 2014-10-31 J Sports 2.62176 4
提供统一军衔的最佳方式是什么?我试着搜索了很多,没有找到任何有用的东西 您可以尝试使用
pd.qcut
:
df['rank'] = pd.qcut(df['value'], 6, [*'654321'])
或
输出:
date name sector value rank
0 2014-10-31 A Information Tech -3.18229 5
1 2014-10-31 B Industrials -52.13330 6
2 2014-10-31 C Consumer Discret 45.34280 1
3 2014-10-31 D Industrials -4.49010 6
4 2014-10-31 E Industrials 6.85653 3
5 2014-10-31 F Information Tech 4.56422 4
6 2014-10-31 H Information Tech 29.31419 1
7 2014-10-31 G Information Tech 6.52422 3
8 2014-10-31 I Sports 16.52422 2
9 2014-10-31 J Sports 2.62176 5
因此,我能够为我的用例找到合适的解决方案。 我使用
cut
函数和rank
函数
df['rank'] = pd.cut(df['value'], 100, labels = list(range(1,101)))
秩是随机数还是
值的某个函数
?如果是我在上面共享的DF,秩应该始终在1到6之间。由于“*”处的语法错误,您的命令失败。所以,我把它拿走了。然后,它无法说明,箱子标签必须比我在这里使用的箱子边缘数少一个
这可能是版本问题,请将[*'654321']替换为['6'、'5'、'4',3'、'2'、'1']pd.qcut(df['value'],6,标签=['6','5','4','3','2','1'])
yes,看起来版本有所不同。我使用的是pandas 0.23.4您使用的是什么版本的python?我使用的是python 3.5.2
df['rank'] = pd.cut(df['value'], 100, labels = list(range(1,101)))