【发布时间】:2020-04-07 13:08:17
【问题描述】:
在给定固定窗口长度的情况下,我正在尝试对另一列中指定的组中出现的观察结果进行滚动计数。最好用一个例子来解释:
df = pd.DataFrame({'B': ['X', 'X' , 'Y', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'Y', 'X', 'Y'],
'group': ["IT", "IT", "IT", "MV", "MV", "MV", "IT", "MV", "MV", "IT", "IT", "MV"]})
我想对'group'进行分组并对B列中的'X'和'Y'进行滚动计数,窗口长度= 3。如果'X'是当前行,那么我们要计算次数'X' 出现在组 'group' 中的前 3 个观察值中,不包括当前行的计数(因此向后移动 period=1)。对于这个例子,我还需要 min_periods=1。
输出应该是这样的
B group count
0 X IT 0
1 X IT 1
2 Y IT 0
3 X MV 0
4 Y MV 0
5 Y MV 1
6 X IT 2
7 X MV 1
8 Y MV 2
9 Y IT 1
10 X IT 1
11 Y MV 2
我已经尝试了以下代码,但它并不完全正确。这按“组”和“B”计算。计数应按“组”计算,而“B”中的观察应按“组”内的最后 3 个周期计算。
df['count'] = df.groupby(['group', 'B']).transform(lambda x: x.rolling(3, min_periods=1).count().shift(fill_value=0))
【问题讨论】:
-
你能解释一下你是如何得到第 10 和第 11 行索引的 1 和 2 的吗?
-
例如查看第 10 行。使用您的公式,这会计算“X”和“IT”在过去 3 次同时出现的次数。相反,我希望在过去 3 次“IT”单独出现的情况下,“X”和“IT”一起出现的次数......如果你查看之前的“IT”,它会在“Y”和 1 中出现两次带有“X”,因此值为 1。
-
这有意义吗?