【问题标题】:Count Re-occurrence of a value in python计数python中值的重新出现
【发布时间】:2018-08-28 20:25:09
【问题描述】:

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

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

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

谁能给我这背后的逻辑或python代码?

【问题讨论】:

  • 你的数据集在表示中的样子并不像一段代码那样有趣,它设置了一个合适的数据结构来包含它。这与创建minimal reproducible example 不同,但相似且用途相似。

标签: python pandas loops count


【解决方案1】:

这样做的一种方法是首先删除连续的Cookies,然后找到在使用duplicated之前看到Cookie的位置,最后是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

【讨论】:

  • 嘿,谢谢.. 但我认为您的答案适用于 cookie 同时出现 2 次,如果出现 2 次以上怎么办?比如说 5 次?那么逻辑是什么呢?
  • 这仍然可以,因为创建no_doubles的代码将摆脱连续的Cookie,无论是连续的2个还是200000个
  • 男人!你刚刚救了我的工作。工作如此顺利!非常感谢朋友:)
  • 完成!谢谢你。您还可以帮助我支持我的答案吗?我是新来的,社区提出了 2 个不好的问题。它会帮助我。谢谢。
  • 你已经得到了我的 +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

【讨论】:

  • DYZ 这样的代码可以在这里算吗:?df.groupby('Cookie').size().reset_index(name='Count')
  • 您的代码不会消除连续重复。
  • DYZ 你能帮我解决这个问题吗:stackoverflow.com/questions/52083723/…
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 2017-12-24
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多