4

上下文

我试图了解python (3.7.3) (0.24.2)中top的属性是如何工作的。describe()pandas

迄今为止的努力

  1. 我查看了pandas.DataFrame.describe的文档。它指出:

    如果多个对象值具有最高计数,则将从具有最高计数的那些中任意选择计数和顶部结果。

    我试图了解代码的哪一部分完全归因于“任意”输出。

  2. 我进入了describe依次调用的代码。我的回溯如下:

describe()  #pandas.core.generic
describe_1d()  #pandas.core.generic
describe_categorical_1d()  #pandas.core.generic
value_counts()  #pandas.core.base
value_counts()  #pandas.core.algorithms
_value_counts_arraylike()  #pandas.core.algorithms
# In the above step it uses hash-table, to find keys and their counts
# I am not able to step further, as further implementations are in C.

样品试用

import pandas as pd
sample = pd.Series(["Down","Up","Up","Down"])
sample.describe()["top"]

如预期的那样,上面的代码可以给出Down或随机给出。Up

问题

  • 回溯中的哪种方法有助于输出的随机性?
  • 从哈希表获得的键的顺序是原因吗?

    如果是,

    -- 不是每次,相同的键具有相同的哈希值并以相同的顺序获取吗?

    -- 如何对键进行散列、迭代(用于获取所有键)和从散列表中获取?

非常感谢任何指针!提前致谢 :)

4

1 回答 1

3

正如上面所指出的,它任意给出“Down”,但不是随机给出。在具有相同 Pandas 版本的同一台机器上,运行上述代码应该始终产生相同的结果(尽管文档不保证,请参阅下面的评论)。

让我们重现正在发生的事情。

鉴于这个系列:

abc = pd.Series(list("abcdefghijklmnoppqq"))

value_counts实现归结为:

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

结果的顺序由哈希表的实现给出。每次通话都是一样的。

您可以查看value_count_object的实现,它调用 build_count_table_object,它使用khash 实现来获取有关散列的更多详细信息。

计算完表格后,value_counts 实现使用快速排序对结果进行排序。这种排序是不稳定的,在这个特殊构造的例子中重新排序“p”和“q”:

result.sort_values(ascending=False)

q    2
p    2
a    1
e    1
f    1
h    1
o    1
d    1
b    1
j    1
m    1
k    1
i    1
n    1
l    1
c    1
g    1
dtype: int64

因此,排序可能有两个因素:首先是散列,其次是不稳定的排序。

显示的最高值只是排序列表的第一个条目,在本例中为“q”。

在我的机器上,快速排序在 17 个条目时变得不稳定,这就是我选择上面示例的原因。

我们可以通过这种直接比较来测试非稳定排序:

pd.Series(list("abcdefghijklmnoppqq")).describe().top
'q'

pd.Series(list(               "ppqq")).describe().top
'p'
于 2019-06-04T16:01:07.360 回答