применить лямбда-функцию, используя group by и используя предыдущее значение строки - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть следующий фрейм данных для каждой даты в час, я хочу создать новый столбец «результат», так что если значение в столбце «B» равно> = 0, то использовать значение в столбце A;в противном случае используйте максимум между 0 и предыдущим значением строки в столбце B

Date    Hour    A     B    result
1/1/2018    1    5     95    5
1/1/2018    1    16    79    16
1/1/2018    1    85   -6     79
1/1/2018    1    12   -18    0
1/1/2018    2    17    43    17
1/1/2018    2    17    26    17
1/1/2018    2    16    10    16
1/1/2018    2    142  -132   10
1/1/2018    2    10   -142   0

Я попытался сгруппировать по дате и часу, а затем применил лямбда-функцию, используя shift, но получил ошибку:

df['result'] = df.groupby(['Date','Hour']).apply(lambda x: x['A'] if x['B'] >= 0 else np.maximum(0, x['B'].shift(1)), axis = 1)

1 Ответ

0 голосов
/ 08 февраля 2019

Используйте np.where.groupby необходим только при сдвиге "B", поэтому вы можете векторизовать эту операцию, не используя apply.

df['result'] = np.where(
    df.B >= 0, 
    df.A, 
    df.groupby(['Date', 'Hour'])['B'].shift().clip(lower=0))
df

       Date  Hour    A    B  result
0  1/1/2018     1    5   95     5.0
1  1/1/2018     1   16   79    16.0
2  1/1/2018     1   85   -6    79.0
3  1/1/2018     1   12  -18     0.0
4  1/1/2018     2   17   43    17.0
5  1/1/2018     2   17   26    17.0
6  1/1/2018     2   16   10    16.0
7  1/1/2018     2  142 -132    10.0
8  1/1/2018     2   10 -142     0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...