#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я использую фрейм данных pandas, и я хотел бы обновить свой столбец ‘signal’ в зависимости от условия.
При выполнении итерации по столбцу, если значение равно ‘1’ или ‘-1’, а следующая строка имеет тот же номер, второе ‘1’ или ‘-1’ должно быть обновлено до 0. В конце не должно быть двух последовательных 1 или -1.
Я пробую этот код и не получил никаких изменений.
for i in df['signal'].iteritems():
if i == 1 :
while next() == 1:
i=0
elif i == -1:
while next() == -1:
i=0
Комментарии:
1. Какой результат вы ожидаете, когда есть 3 последовательных 1? Например, каким должен быть результат, если ваш столбец ‘signal’ содержит значения [1, 1, 1, -1, 1, -1, -1 , 1] ?
2. у меня должен быть только такой результат [1,0,0,1, -1,1,0,0,0, -1,0] ‘в качестве примера’, потому что этот столбец поможет мне позже установить некоторые другие различные вычисления в другом столбце. когда у меня есть два последовательных 1 или -1, другой столбец не может выполнить мои реальные вычисления.
3. у @gpweb никогда не будет последовательности 1 или -1, поэтому никогда не будет 3 последовательных, как вы сказали. Я не знаю, хорошо ли я объясняю свою проблему, но цель состоит в том, чтобы никогда не повторять значение 1 или -1, пока оно не будет разбито на 0. это означает, что мне разрешено иметь последовательные 0 в моем столбце. Не могли бы вы помочь в этом, пожалуйста?
4. Вы должны предоставить пример ввода (содержимого df[‘signal’]) и ожидаемого вывода, потому что это действительно непонятно.
5. вот мой пример; signal — это столбец, который у меня есть, и я добавил столбец ‘expected_signal’ для вас, просто чтобы объяснить, что на самом деле должен содержать мой первый сигнал:
Ответ №1:
Вы можете создать новый столбец в фрейме данных с данными, сдвинутыми на 1, и новый столбец для вывода. Если в строке исходный сигнал и сдвинутый равны, это означает, что, например, есть два последовательных 1 (и вы находитесь в строке второго). Итак, вы помещаете 0 в выходной столбец. В противном случае вы копируете исходное значение.
Вы могли бы начать с этого кода (кажется, он работает с данными, которые вы указали в комментариях, но вам следует проверить и другие примеры):
df = pd.DataFrame([1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0 ])
df['shifted'] = df.shift(1) #add the column with shifted values
df['output'] = df.apply(lambda x: x[0] if x.signal != x.shifted else 0, axis=1)