我正在努力在Pandas数据框中获得“价值知名度”。
Key RandomColumn
a 0
b ...
c does
d not
a matter
e ...
c ...
我想使用一个2的滚动窗口,并计算“此”值的次数(已从相关行中看到)。
输出:
Key RandomColumn Popularity
a 0 0
b ... 0
c does 0
d not 0
a matter 0 <--- outside past window of 2
d ... 1
c ... 0 <-- outside window too
c .... 1
c .... 2
我一直在尝试 groupby 之类的方法,但是后来我失去了滑动性,我可以通过 rolling 来获得滑动性,但是不确定如何聚合和返回。 / p>
最后一次尝试我遇到类似这样的情况:
df['popularity']=df.groupby('key').cumcount().rolling(2, min_periods=1).sum()
但这显然是错误的。
我总是可以使用 for循环或 apply 进行索引和手动计数,但想知道熊猫中是否有“适当”的方法
更新:例子2:“计算过去N条记录中给定值X出现的次数”,为简单起见,假设N = 2
For the Series: [a, b, b, c, d, a, b, c, c, c, a, b]
The output is: [0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 0, 0]
a和b的前2个零(0,0)从未见过,然后(1) b 在过去2个值中见过1次,依此类推。
答案 0 :(得分:1)
使用 shift()
, rolling
和 np.where
:
.shift
标记上一行等于当前行的所有行.rolling
rolling(2)
拖移了第一行太远了。m1 = df.eq(df.shift())
m2 = df.eq(df.shift()).rolling(2).sum()
df['Popularity'] = np.where(m1, m2, 0).astype(int)
输出
Key Popularity
0 a 0
1 b 0
2 b 1
3 c 0
4 d 0
5 a 0
6 b 0
7 c 0
8 c 1
9 c 2
10 a 0
11 b 0
使用的输入数据框:
Key
0 a
1 b
2 b
3 c
4 d
5 a
6 b
7 c
8 c
9 c
10 a
11 b
答案 1 :(得分:0)
显然,rolling
不能用于非数字对象。例如参见this answer。
因此,对于可以选择N
的常规解决方案,for
循环可能是最好的方法。
您可以定义一个函数,例如:
def popularitycount(sr, n):
"""sr is an iterable (a list, tuple, or pandas Series), n an integer"""
previous = []
res = []
for el in sr:
res.append(previous.count(el))
previous.append(el)
if len(previous) > n:
previous.pop(0)
return pd.Series(res)
使用您的输入,将返回以下Series
:
0 0
1 0
2 1
3 0
4 0
5 0
6 0
7 0
8 1
9 2
10 0
11 0
dtype: int64