计数python中值的重新出现

时间:2018-08-28 20:25:10

标签: python pandas loops count

我有一个数据集,其中包含以下内容:

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在第二位,但是在第7位和第12位,我们在再次看到A之前已经看到了许多新的Cookie,因此我们将该实例计数。所以本质上我想要这样的东西:

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

任何人都可以在此背后给我逻辑或python代码吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

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饼干具有滞后的自我,可以消除非重复

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