Как мне заполнить только тогда, когда столбец равен 1 в фрейме данных Pandas

#python #pandas #numpy

#python #pandas #numpy

Вопрос:

У меня есть столбец signal, и я хочу создать столбец NewSignal, который принимает значение Signal только тогда, когда разрешенный столбец равен 1, в противном случае он должен сохранять свое предыдущее значение:

 df:
        Signal  Allowed  NewSignal
    0       -1        0          0
    1       -1        0          0
    2       -1        0          0
    3       -1        1         -1
    4       -1        1         -1
    5       -1        1         -1
    6       -1        1         -1
    7       -1        0         -1
    8       -1        0         -1
    9        1        0         -1
    10       1        1          1
    11       1        1          1
    12       1        1          1
 

Когда я пытаюсь создать NewSignal следующим образом:

 df['NewSignal'] = 0
df['NewSignal'] = np.where(df['Allowed'] == 1,df['Signal'],df['NewSignal'].shift(1))
 

NewSignal НЕВЕРЕН в строке 7:

     Signal  Allowed  NewSignal
0       -1        0        NaN
1       -1        0        0.0
2       -1        0        0.0
3       -1        1       -1.0
4       -1        1       -1.0
5       -1        1       -1.0
6       -1        1       -1.0
7       -1        0        0.0
8       -1        0        0.0
9        1        0        0.0
10       1        1        1.0
11       1        1        1.0
12       1        1        1.0
 

Комментарии:

1. Не могли бы вы опубликовать исходный NewSignal?

2. @DaniMesejo я не думаю, что есть оригинал NewSignal . OP хочет полностью создать новый столбец.

3. @MayankPorwal Для меня вопрос сбивает с толку. Что тогда означает «сохранить его собственное предыдущее значение»?

4. @DaniMesejo Итак, он имеет в виду, что если Allowed == 0 , то заполнить предыдущее значение строки NewSignal . В этом случае в идеале первые 3 строки должны быть NaN since Allowed == 0 , затем для строк 3 to 6 , Allowed == 1 , поэтому заполните Signal значение NewSignal . Затем для строк 7 to 9 , Allowed == 0 поэтому заполните NewSignal значение из строки 6 . Аналогично для остальных.

Ответ №1:

Попробуйте с ffill помощью where

 df['Nsg'] = df.Signal.where(df.Allowed==1).ffill()
Out[253]: 
0     NaN
1     NaN
2     NaN
3    -1.0
4    -1.0
5    -1.0
6    -1.0
7    -1.0
8    -1.0
9    -1.0
10    1.0
11    1.0
12    1.0
Name: Signal, dtype: float64
 

Комментарии:

1. В любом случае я могу сделать начальный nan 0 в том же операторе?

2. Используйте df.Signal.where(df.Allowed==1).ffill().fillna(0) .

3. @ManInMoon добавление fillna (0) в конце

4. Чувак, это просто!