[英]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.