【问题标题】:Pandas: conditional rolling count by group, counting the number of times current observation appeared in another columnPandas:按组条件滚动计数,计算当前观察出现在另一列的次数
【发布时间】: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。
  • 这有意义吗?

标签: python pandas


【解决方案1】:

我在下面有一个解决方案,但我正在寻找一个更好的解决方案,因为“B”列可能有许多不同的观察结果,因此速度很慢。

for i in df['B'].unique():
    df.loc[df['B']==i, 'count'] = df.where(df['B'].eq(i)).groupby(df['group'])['B'].transform(lambda x: x.rolling(3, min_periods=1).count().shift(fill_value=0))
df

    B group count
0   X   IT  0.0
1   X   IT  1.0
2   Y   IT  0.0
3   X   MV  0.0
4   Y   MV  0.0
5   Y   MV  1.0
6   X   IT  2.0
7   X   MV  1.0
8   Y   MV  2.0
9   Y   IT  1.0
10  X   IT  1.0
11  Y   MV  2.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2022-11-07
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多