Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当多个元素的计数最高时,top如何工作?_Python_Python 3.x_Pandas_Hashtable_Describe - Fatal编程技术网

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'