Обновление следующей строки в определенном столбце в фрейме данных pandas в зависимости от условия

#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)