#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 в начале, чтобы проверить, меньше ли он, и внести изменения.