Contagem Re-ocorrência de um valor em python

Eu tenho um dataset que contém algo como isto:

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 

Então digamos que temos 5 cookies ‘A, B, C, D, E’ . Agora quero contar se algum cookie voltou a ocorrer depois que um novo cookie foi encontrado. Por exemplo, no exemplo acima, o cookie A foi encontrado novamente no 7º lugar e depois no 12º lugar também. OBSERVAÇÃO Não contaríamos A no 2º lugar, pois ele veio simultaneamente, mas na posição 7 e 12 vimos muitos cookies novos antes de ver A novamente, por isso contamos essa instância. Então, basicamente eu quero algo assim:

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

Alguém pode me dar lógica ou código python por trás disso?

Uma maneira de fazer isso seria primeiro eliminar os Cookies consecutivos, depois descobrir onde o Cookie foi visto antes de usar o Cookie duplicated e, finalmente, groupby e obter a sum:

 no_doubles = df[df.Cookie != df.Cookie.shift()] no_doubles['dups'] = no_doubles.Cookie.duplicated() no_doubles.groupby('Cookie').dups.sum() 

Isso te dá:

 Cookie A 2.0 B 1.0 C 0.0 D 2.0 E 0.0 Name: dups, dtype: float64 

Comece removendo duplicatas consecutivas e conte os sobreviventes:

 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 

pandas.factorize e numpy.bincount

  1. Se os valores imediatamente repetidos não forem contados, remova-os.
  2. Faça uma contagem normal de valores sobre o que resta.
  3. No entanto, isso é mais do que o pedido, subtraia um.

  1. factorize
  2. Filtrar repetições imediatas
  3. bincount
  4. Produzir 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 cookies com o seu self defasado, retirando não repetições

 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 
Intereting Posts