У меня есть датафрейм из нулей и единиц.Я перебираю каждый столбец с помощью цикла.Если я получу один на итерации, я должен оставить его в столбце.Но если в следующих n
позициях после этой есть некоторые, я должен превратить их в нули.Затем повторите то же самое до конца столбца, а затем повторите все это для каждого столбца.
Можно ли избавиться от цикла и векторизовать все с помощью операций с кадрами / матрицами / массивами в pandas / numpy?И как мне это сделать?n
может быть где угодно от 2 до 100.
Я попробовал эту функцию, но не смог, она сохраняет единицы, если между ними есть хотя бы n
нулей, что, очевидно, не то, что мне нужно:
def clear_window(df, n):
# create buffer of size n
pad = pd.DataFrame(np.zeros([n, df.shape[1]]),
columns=df.columns)
padded_df = pd.concat([pad, df])
# compute rolling sum and cut off the buffer
roll = (padded_df
.rolling(n+1)
.sum()
.iloc[n:, :]
)
# delete ones where rolling sum is above 1 or below -1
result = df * ((roll == 1.0) | (roll == -1.0)).astype(int)
return result