У меня есть набор данных, который содержит что-то вроде этого:
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 за этим?
Один из способов сделать это - сначала избавиться от последовательных 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
no_doubles
избавит от последовательных файлов cookie, независимо от того, существует ли 2 или 200000 последовательно
Начните с удаления последовательных дубликатов, затем посчитайте выживших:
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
df.groupby('Cookie').size().reset_index(name='Count')
pandas.factorize
и numpy.bincount
factorize
bincount
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