Python 当多个元素的计数最高时,top如何工作?
上下文: 我试图理解Python 当多个元素的计数最高时,top如何工作?,python,python-3.x,pandas,hashtable,describe,Python,Python 3.x,Pandas,Hashtable,Describe,上下文: 我试图理解descripe()的top属性在python(3.7.3)pandas(0.24.2)中是如何工作的 迄今为止的努力: 我查阅了该文件。它指出: 如果多个对象值具有最高计数,则将从具有最高计数的对象值中任意选择计数和顶部结果 我试图理解代码的哪一部分确切地属于“任意”输出 我进入了由descripe依次调用的代码。 我的回溯如下: descripe()#pandas.core.generic 描述_1d()#pandas.core.generic 描述_category_1
descripe()
的top
属性在python(3.7.3)pandas
(0.24.2)中是如何工作的
迄今为止的努力:
descripe
依次调用的代码。
我的回溯如下:descripe()#pandas.core.generic
描述_1d()#pandas.core.generic
描述_category_1d()#pandas.core.generic
value_counts()#pandas.core.base
value_counts()#pandas.core.algorithms
_value_counts_arraylike()#pandas.core.algorithms
#在上面的步骤中,它使用哈希表来查找键及其计数
#我不能更进一步,因为更多的实现都是用C语言实现的。
样本试验:
将熊猫作为pd导入
样本=pd.系列([“向下”、“向上”、“向上”、“向下”])
sample.descripe()[“top”]
上述代码可以按预期随机给出Down
或Up
问题:
- 回溯中的哪种方法导致了输出的随机性
- 从哈希表中获取的键的顺序是否是原因 如果是 --不是每一次,同一个密钥都有相同的散列,并且以相同的顺序获取吗 --如何对键进行哈希、迭代(用于获取所有键)和从哈希表中获取键
非常感谢您的指点!提前感谢:)如上所述,它任意给出“Down”,但不是随机给出的。在具有相同版本的同一台机器上,运行上述代码应始终产生相同的结果(尽管文档不保证这一点,请参阅下面的注释) 让我们重现正在发生的事情 鉴于这一系列:
abc = pd.Series(list("abcdefghijklmnoppqq"))
问题归结为:
import pandas._libs.hashtable as htable
keys, counts = htable.value_count_object(np.asarray(abc), True)
result = pd.Series(counts, index=keys)
结果:
g 1
e 1
f 1
h 1
o 1
d 1
b 1
q 2
j 1
k 1
i 1
p 2
n 1
l 1
c 1
m 1
a 1
dtype: int64
结果的顺序由哈希表的实现给出。每次通话都是一样的
您可以研究的实现,它调用build\u count\u table\u对象,该对象可以获得有关哈希的更多详细信息
计算表后,值_counts实现是使用快速排序的结果。这种排序不稳定,在这个特殊构造的示例中,重新排序“p”和“q”:
因此,排序可能有两个因素:第一个是散列,第二个是非稳定排序
然后,显示的最大值就是已排序列表的最大值,在本例中为“q”
在我的机器上,快速排序在17个条目时变得不稳定,这就是我选择上面示例的原因
我们可以通过这种直接比较来测试非稳定排序:
pd.Series(list("abcdefghijklmnoppqq")).describe().top
'q'
pd.Series(list( "ppqq")).describe().top
'p'
任意并不意味着随机。@Goyo,谢谢你的输入。我想澄清我对
任意
和随机
的理解。“任意”是否意味着它是一个伪随机生成的值,而不是一个随机值?”在同一台具有相同版本的机器上,运行上述代码将始终产生相同的结果。“如果文档没有明确说明,我认为您不应该依赖于此。武断也不意味着确定性。我相信在实践中,使用“武断”一词意味着确定性的结果。我很确定对同一数据调用两次.descripe()
,得到不同的答案会被认为是一个bug。另外,我在实际代码中没有看到任何不确定性的来源。当然,您是对的,doc没有明确排除此类行为,因此在重要情况下您不应该依赖它。感谢@w-m,我在我的系统中进行了重新尝试,得到了htable(result
)的输出顺序不同,并且还了解,sort\u值使用了快速排序
,这是一种不稳定的算法。
pd.Series(list("abcdefghijklmnoppqq")).describe().top
'q'
pd.Series(list( "ppqq")).describe().top
'p'