我有一个数据集,其中包含以下内容:
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代码吗?
答案 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.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
饼干具有滞后的自我,可以消除非重复
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