Count Повторное вхождение значения в python - PullRequest
0 голосов
/ 28 августа 2018

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

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 куки '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 за этим?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

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

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 голосов
/ 29 августа 2018

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 печенье с его запаздывающим я, вытягивающим не повторяется

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
0 голосов
/ 28 августа 2018

Один из способов сделать это состоит в том, чтобы сначала избавиться от последовательных 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...