Проверка состояния в отрицательном скользящем окне в GroupBy в Pandas - PullRequest
0 голосов
/ 06 октября 2018

Вот как выглядит мой фрейм данных.Expected_Output столбец - это мой желаемый / целевой столбец.

   Group  Value  Expected_Output
0      1      2                1
1      1      3                1
2      1      6                1
3      1     11                0
4      1      7                0
5      2      3                1
6      2     13                1
7      2     14                0

Для данного Group, начиная с данной строки, я просматриваю следующие 5 строк и проверяю,любой Value > 10.Если true, то я хочу вернуть 1 в Expected_Output, иначе 0.

Например, в Group 1, начиная с самой первой строки, Value из 11 (что больше 10)появляется в пределах 3 строк и попадает в «окно следующих 5 строк», которое удовлетворяет условию, и, таким образом, 1 возвращается в Expected_Output.Аналогично строке 6 в Group 2, Value из 14 (что больше 10) появляется в 1 строке и попадает в «окно следующих 5 строк», которое удовлетворяет условию, и, таким образом, 1 возвращается в Expected_Output.

Я пытался df.groupby('Group')['Value'].rolling(-5).max() > 10 безрезультатно.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

pd.Series.rolling по умолчанию смотрит назад.Чтобы посмотреть вперед, вы можете перевернуть кадр данных, а затем сторнировать результат GroupBy.Вам нужно включить shift, потому что вы ищете значения next 5.

def roller(x):
    return x.rolling(window=5, min_periods=1)['Value'].max().shift().gt(10).astype(int)

df['Result'] = df.iloc[::-1].groupby('Group', sort=False).apply(roller).iloc[::-1].values

print(df)

   Group  Value  Result
0      1      2       1
1      1      3       1
2      1      6       1
3      1     11       0
4      1      7       0
5      2      3       1
6      2     13       1
7      2     14       0
0 голосов
/ 06 октября 2018

Вы можете попробовать сгруппировать фрейм данных и использовать индекс фрейма данных, чтобы получить следующие 5 возможных значений и проверить любое значение больше 10

df['Expected_Output'] =df.groupby(['Group'])['Value'].transform(lambda y:list(map(lambda x: 1 if any(y.loc[set(np.arange(x+1,x+6)).intersection(y.index)] >10) else 0,y.index)))

Out:

    Group   Value   Expected_Output
0   1   2   1
1   1   3   1
2   1   6   1
3   1   11  0
4   1   7   0
5   2   3   1
6   2   13  1
7   2   14  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...