Как найти значения, которые встречаются определенное количество раз в серии Панд? - PullRequest
0 голосов
/ 11 сентября 2018

Для следующих серий:

sr = pd.Series([5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8])

Я хочу найти значения, которые встречаются 3 раза.Это мое решение, которое, кажется, работает, но выглядит очень странно:

(sr.value_counts() == 3)[sr.value_counts() == 3].index.values

Есть ли другой / очевидный способ, которого я пропускаю?

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

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

sr.where(sr.value_counts()==3).dropna().index

# Output:
Int64Index([5, 6, 8], dtype='int64')
0 голосов
/ 11 сентября 2018

@ jpp ответ, вероятно, тот, с которым вам следует пойти, но вот странная альтернатива (просто для удовольствия):

sr.groupby(sr).filter(lambda x: len(x) == 3).unique()
#array([5, 6, 8])
0 голосов
/ 11 сентября 2018

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

sr.value_counts().loc[lambda x : x==3].index
Out[162]: Int64Index([8, 6, 5], dtype='int64')
0 голосов
/ 11 сентября 2018

Ваша логика в порядке, вы просто не должны повторять самую дорогую часть - подсчет. Сохраните это в переменной и используйте повторно. Вам также может не потребоваться получить базовый массив NumPy, часто достаточно pd.Index объектов:

sr = pd.Series([5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8])

counts = sr.value_counts()

res = counts[counts == 3].index
# Int64Index([8, 6, 5], dtype='int64')

Причина, по которой нет готового метода для того, что вам нужно, заключается в том, что любое решение потребует минимальной временной сложности O ( n ), которая равна сложности value_counts. Обойти это невозможно.

Одна альтернатива, dict на основе collections.Counter, будет менее эффективной, когда дело доходит до фильтрации по количеству. Поскольку массивы NumPy эффективно хранятся в памяти, логическая фильтрация эффективна относительно итераций словаря.

...