Как указывалось выше, он дает «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'