#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
sinceAllowed == 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. Чувак, это просто!