在R中,使用秩函数时随机断开关系的方法很简单:
rank(my_vec, ties.method = "random")
然而,虽然scipy(scipy.stats.rankdata)和pandas(pandas.Series.rank)都有排名函数,但它们都没有提出一种随机打破关系的方法。 有没有一种简单的方法在python中使用具有此功能的框架?鉴于列表顺序必须保持不变。
答案 0 :(得分:3)
熊猫' rank允许这些方法:
method : {'average', 'min', 'max', 'first', 'dense'}
* average: average rank of group
* min: lowest rank in group
* max: highest rank in group
* first: ranks assigned in order they appear in the array
* dense: like 'min', but rank always increases by 1 between groups
简单地说""实现您的目标,我们可以在随机化系列之后使用'first'
。
假设我的系列名为my_vec
my_vec.sample(frac=1).rank(method='first')
然后您可以按照与
相同的顺序将其恢复my_vec.sample(frac=1).rank(method='first').reindex_like(my_vec)
示例运行
my_vec = pd.Series([1, 2, 3, 1, 2, 3])
试用1
my_vec.sample(frac=1).rank(method='first').reindex_like(my_vec)
0 2.0 <- I expect this and
1 4.0
2 6.0
3 1.0 <- this to be first ranked
4 3.0
5 5.0
dtype: float64
试用2
my_vec.sample(frac=1).rank(method='first').reindex_like(my_vec)
0 1.0 <- Still first ranked
1 3.0
2 6.0
3 2.0 <- but order has switched
4 4.0
5 5.0
dtype: float64