Выполнение условия постоянным после достижения предела

#python #pandas

#python #панды

Вопрос:

Я изо всех сил стараюсь сделать условия постоянными после того, как они будут достигнуты.

У меня такая настройка:

 dft2 =  pd.DataFrame([[True,1],[True,0],[True,1],[True,0],[True,1],[True,0],[False,1],[True,1],[True,1],[True,1]],columns = ['a','b'])
dft2['c'] = np.where(dft2['a']==True,dft2['b'],0)
dft2["cumc"] = dft2['c'].cumsum()
limit = 3
  

Теперь, если cumc достигнет предела (на самом деле это должен быть абсолютный предел). Я хотел бы установить ‘cumc’ равным нулю, поместив смещение в ‘c’. Затем я хотел бы установить все строки ниже равными нулю как для ‘cumc’, так и для ‘c’.

Это обеспечивает правильное поведение в строке, где достигнут предел, но не после этого.

 dft2["cumc"]=np.where(abs(dft2["c"].cumsum())==limit,0,dft2["c"].cumsum())
dft2['c']=np.where(abs(dft2["c"].cumsum())==limit,np.sign(dft2["c"].cumsum())*(abs(dft2["c"].cumsum())-1)*-1,dft2['c'])
  

Ожидаемый результат будет:

Столбцы ‘a’ и ‘b’ без изменений, а ‘c’ и ‘cumc’ как есть, но нули начиная со строки 5 и далее

Ответ №1:

Вы можете просто найти индекс строки, где cumsum равно пределу, а затем присвоить всем значениям после этого значение равно нулю.

 ##look for the first index where the condition matches 
index = dft2[dft2['cumc']==limit].index[0]

## assign all values after that to zero
dft2['c'].values[index:] = 0
dft2['cumc'].values[index:] = 0
  

Вывод:

     a       b   c   cumc
0   True    1   1   1
1   True    0   0   1
2   True    1   1   2
3   True    0   0   2
4   True    1   0   0
5   True    0   0   0
6   False   1   0   0
7   True    1   0   0
8   True    1   0   0
9   True    1   0   0
  

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

1. спасибо, очень простое и приятное решение. Но предполагается, что limit фактически является частью серии. если это не так, он возвращается с ошибкой

2. что вы подразумеваете под limit на самом деле является частью серии? Логически это должно произойти в нем, верно?

3. нет, это не верхняя граница, которая может быть выше всех чисел в cumc

4. Если это так, то почему бы не поместить оператор if в начале, чтобы проверить, меньше ли он, и внести изменения.