Pandas Series value_counts работает по-разному для разных количеств - PullRequest
0 голосов
/ 14 ноября 2018

Например:

df1 = pd.DataFrame(np.repeat(np.arange(1,7),3), columns=['A'])

df1.A.value_counts(sort=False)
1    3
2    3
3    3
4    3
5    3
6    3
Name: A, dtype: int64

df2 = pd.DataFrame(np.repeat(np.arange(1,7),100), columns=['A'])

df2.A.value_counts(sort=False)
1    100
2    100
3    100
4    100
5    100
6    100
Name: A, dtype: int64

В приведенных выше примерах value_counts отлично работает и дает требуемый результат. тогда как при переходе к большим фреймам данных это дает другой результат. Здесь значения A уже отсортированы, и их значения также совпадают, но порядок индекса, который равен A, изменился после value_counts. Почему это правильно для небольших подсчетов, но не для больших подсчетов:

df3 = pd.DataFrame(np.repeat(np.arange(1,7),1000), columns=['A'])

df3.A.value_counts(sort=False)
4    1000
1    1000
5    1000
2    1000
6    1000
3    1000
Name: A, dtype: int64

Здесь я могу сделать df3.A.value_counts(sort=False).sort_index() или df3.A.value_counts(sort=False).reindex(df.A.unique()). Я хочу знать причину, по которой он ведет себя по-разному для разных подсчетов?

Использование:

Numpy version :1.15.2
Pandas version :0.23.4

1 Ответ

0 голосов
/ 14 ноября 2018

Это на самом деле известная проблема.

Если вы просматриваете исходный код -

  1. C:\ProgramData\Anaconda3\Lib\site-packages\pandas\core\algorithims.py строка 581 - исходная реализация
  2. Вызывает _value_counts_arraylike для int64 значений, когда bins=None
  3. Эта функция выполняет вызов - keys, counts = htable.value_count_int64(values, dropna)

Если вы затем посмотрите на реализацию htable, то заключите, что ключи расположены в произвольном порядке, в зависимости от того, как работает hashtable.

Это не гарантия ЛЮБОГО вида заказа. Обычно эта процедура сортируется по наибольшим значениям, и это почти всегда то, что вы хотите.

Полагаю, они могут изменить это, чтобы sort=False означало исходный порядок. Я не знаю, действительно ли это что-то сломает (и внутренне это не очень дорого, так как уникальные уже известны).

Заказ изменен с pandas/hashtable.pyx.build_count_table_object(). Изменение размера pymap перемещает записи по значениям хэширования.

Вот полное обсуждение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...