Когда я запускаю код ниже:

s = pandas.Series(['c', 'a', 'b', 'a', 'b'])
print(s.value_counts())

Иногда я получаю это:

a    2
b    2
c    1
dtype: int64

И иногда я получаю это:

b    2
a    2
c    1
dtype: int64

Например порядок индекса, возвращаемый для эквивалентных значений, не совпадает. Я не мог воспроизвести это, если значения Серии - целые числа вместо строк.

Почему это происходит, и каков самый эффективный способ каждый раз получать один и тот же порядок индекса?

Я хочу, чтобы он по-прежнему сортировался в порядке убывания по количеству, но был последовательным в порядке элементов с эквивалентным количеством.

Я использую Python 3.7.0 и pandas 0.23.4

7
Kdawg 20 Авг 2018 в 18:14

3 ответа

Лучший ответ

У вас есть несколько вариантов последовательной сортировки по данной серии:

s = pd.Series(['a', 'b', 'a', 'c', 'c'])
c = s.value_counts()

Сортировать по индексу

Используйте pd.Series.sort_index:

res = c.sort_index()

a    2
b    1
c    2
dtype: int64

Сортировать по количеству (произвольно для связей)

Для нисходящих отсчетов ничего не делать, так как это по умолчанию. В противном случае вы можете использовать pd.Series.sort_values по умолчанию ascending=True. В любом случае вы не должны делать никаких предположений о том, как обрабатываются связи.

res = c.sort_values()

b    1
c    2
a    2
dtype: int64

Более эффективно вы можете использовать c.iloc[::-1] для изменения порядка.

Сортировать по количеству, а затем по индексу

Вы можете использовать numpy.lexsort для сортировки по количеству и затем по индексу. Обратите внимание на обратный порядок, т. Е. -c.values используется first для сортировки.

res = c.iloc[np.lexsort((c.index, -c.values))]

a    2
c    2
b    1
dtype: int64
4
jpp 20 Авг 2018 в 15:47

Вы можете использовать sort_index:

print(df.value_counts().sort_index())

Выход:

a    1
b    1
dtype: int64

Пожалуйста, ознакомьтесь с документацией, если вы хотите использовать параметры (например, ascending=True и т. д.)

sort_index vs reindex(df.unique()) (как предложено @Wen), похоже, работают очень похоже:

df.value_counts().sort_index():         1000 loops, best of 3: 636 µs per loop
df.value_counts().reindex(df.unique()): 1000 loops, best of 3: 880 µs per loop
1
Hoenie 20 Авг 2018 в 15:32

Добавление reindex после value_counts

df.value_counts().reindex(df.unique())
Out[353]: 
a    1
b    1
dtype: int64

Обновить

s.value_counts().sort_index().sort_values()
2
YOBEN_S 11 Июл 2019 в 01:49
51933763