在python中计算值的重复出现次数

2024-05-02 17:03:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含如下内容的数据集:

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再次出现。例如,在上述示例中,第7位和第12位再次遇到cookieA注意我们不会计算第二位的A,因为它同时出现,但在第七位和第十二位,我们在再次看到A之前看到了许多新的cookie,因此我们计算该实例。所以本质上我想要这样的东西:

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

有人能告诉我这背后的逻辑或python代码吗?你知道吗


Tags: 数据实例代码示例内容cookiecount逻辑
3条回答

从删除连续的重复项开始,然后计算生存者:

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

一种方法是首先去掉连续的Cookies,然后在使用duplicated之前找到Cookie的位置,最后groupbycookie并得到总和:

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

pandas.factorizenumpy.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

相关问题 更多 >