Count Повторное вхождение значения в python

1

У меня есть набор данных, который содержит что-то вроде этого:

SNo  Cookie
1       A
2       A
3       A
4       B
5       C
6       D
7       A
8       B
9       D
10      E
11      D
12      A

Итак, скажем, у нас есть 5 файлов cookie "A", "B", "C", "D", "E". Теперь я хочу подсчитать, если какой-либо cookie был повторно обнаружен после того, как был встречен новый файл cookie. Например, в приведенном выше примере cookie A встречается снова на 7-м месте, а затем и на 12-м месте. ПРИМЕЧАНИЕ. Мы не будем считать A на 2-м месте одновременно, но в позиции 7 и 12 мы увидели много новых файлов cookie, прежде чем снова увидеть A, поэтому считаем этот экземпляр. Поэтому я хочу что-то вроде этого:

Sno Cookie  Count
 1     A     2
 2     B     1
 3     C     0
 4     D     2
 5     E     0

Может ли кто-нибудь дать мне логику или код на Python за этим?

  • 0
    То, как ваш набор данных выглядит в представлении, не так интересно, как фрагмент кода, который устанавливает подходящую структуру данных для ее содержания. Это не то же самое, что сделать минимальный воспроизводимый пример , но похоже и служит аналогичным целям.
Теги:
pandas
loops
count

3 ответа

3
Лучший ответ

Один из способов сделать это - сначала избавиться от последовательных Cookies, а затем найти, где Cookie был замечен перед использованием duplicated, и, наконец, groupby cookie и получить сумму:

no_doubles = df[df.Cookie != df.Cookie.shift()]

no_doubles['dups'] = no_doubles.Cookie.duplicated()

no_doubles.groupby('Cookie').dups.sum()

Это дает вам:

Cookie
A    2.0
B    1.0
C    0.0
D    2.0
E    0.0
Name: dups, dtype: float64
  • 0
    Эй, спасибо .. Но я думаю, что ваш ответ работает на cookie, приходит 2 раза одновременно, что, если он приходит более 2 раз, скажем, 5 раз? Тогда в чем будет логика?
  • 0
    Это все еще будет работать, потому что код для создания no_doubles избавит от последовательных файлов cookie, независимо от того, существует ли 2 или 200000 последовательно
Показать ещё 4 комментария
2

Начните с удаления последовательных дубликатов, затем посчитайте выживших:

no_dups = df[df.Cookie != df.Cookie.shift()] # Borrowed from @sacul
no_dups.groupby('Cookie').count() - 1
#        SNo
#Cookie     
#A         2
#B         1
#C         0
#D         2
#E         0
  • 0
    DYZ Может ли такой код сделать отсчет здесь? df.groupby('Cookie').size().reset_index(name='Count')
  • 1
    Ваш код не устранит последовательные дубликаты.
Показать ещё 1 комментарий
1

pandas.factorize и numpy.bincount

  1. Если сразу повторяющиеся значения не учитываются, удалите их.
  2. Сделайте обычный подсчет значений на том, что осталось.
  3. Тем не менее, это еще одно, чем то, что требуется, поэтому вычтите один.

  1. factorize
  2. Отфильтровывать немедленные повторы
  3. bincount
  4. Производить pandas.Series

i, r = pd.factorize(df.Cookie)
mask = np.append(True, i[:-1] != i[1:])
cnts = np.bincount(i[mask]) - 1

pd.Series(cnts, r)

A    2
B    1
C    0
D    2
E    0
dtype: int64

pandas.value_counts

zip cookie с его отстающим "я", вытаскивая не повторы

c = df.Cookie.tolist()

pd.value_counts([a for a, b in zip(c, [None] + c) if a != b]).sort_index() - 1

A    2
B    1
C    0
D    2
E    0
dtype: int64

defaultdict

from collections import defaultdict

def count(s):
  d = defaultdict(lambda:-1)
  x = None
  for y in s:
    d[y] += y != x
    x = y

  return pd.Series(d)

count(df.Cookie)

A    2
B    1
C    0
D    2
E    0
dtype: int64

Ещё вопросы

Сообщество Overcoder
Наверх
Меню