簡體   English   中英

Pandas:按組條件滾動計數,計算當前觀察出現在另一列的次數

[英]Pandas: conditional rolling count by group, counting the number of times current observation appeared in another column

我正在嘗試對出現在一個列中的觀察結果進行滾動計數,給定另一列中指定的組的固定 window 長度。 用一個例子可以更好地解釋這一點:

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'進行滾動計數,window長度= 3。如果'X'是當前行,那么我們要計算'X'的次數出現在組“組”中的前 3 個觀察值中,不包括當前行的計數(因此向后移動 period=1)。 對於這個例子,我還需要 min_periods=1。

output 應該看起來像

     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))

我在下面有一個解決方案,但我正在尋找一個更好的解決方案,因為“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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM