Как узнать количество первых последовательных раз, когда значение оставалось неизменным в кадре данных в каждой строке
Я задал вопрос, связанный с этой темой;
какнайти количество последовательных уменьшений (увеличений)
Но сейчас у меня немного другая проблема.Мне нужно найти количество первых последовательных раз, когда значение оставалось неизменным в кадре данных для каждой строки.Если [i]! = [I + 1], то результат должен быть 0. Я пробовал несколько решений, но наткнулся на ошибку, которую я объясню ниже.
У меня есть фрейм данных, который имеет 500K строк и 12 столбцовна месяцы и включают начало и конец месяца.Каждый столбец представляет месяц.Мне нужно сравнить все строки, i-й месяц и (i + 1) -й месяц в диапазоне (startMonth, endmonth).(Ps: диапазон не является постоянным. Ряд бедности имеет другой размер диапазона.)
Условие: если начальный месяц> конечный месяц, я должен увидеть «Neg99 = -999»
Вот мой примерданные:
import pandas as pd
import numpy as np
idx = [1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013]
data = {'M_1': [3, 1, 0, 0, 1, 0, 1, 1, 1, 0, 6, 6, 6],
'M_2': [2, 2, 3, 1, 1, 0, 1, 2, 0, 1, 5, 5, 5],
'M_3': [1, 3, 2, 2, 1, 0, 1, 2, 1, 0, 4, 4, 4],
'M_4': [0, 4, 1, 3, 1, 0, 1, 2, 0, 1, 3, 0, 3],
'M_5': [1, 0, 0, 4, 2, 0, 1, 3, 1, 0, 2, 1, 2],
'M_6': [2, 0, 0, 0, 3, 0, 1, 3, 0, 1, 1, 2, 1],
'M_7': [3, 0, 0, 0, 2, 0, 1, 2, 1, 0, 0, 3, 0],
'M_8': [0, 1, 0, 0, 2, 0, 1, 2, 0, 1, 1, 1, 1],
'M_9': [0, 2, 0, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0],
'M_10': [0, 3, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0],
'M_11': [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0],
'M_12': [0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0]}
startMonth = pd.DataFrame([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 5],
columns=['start'],index=idx)
endMonth = pd.DataFrame([12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2],
columns=['end'], index=idx)
df1 = pd.DataFrame(data, index=idx)
Neg99 = -999
Я написал массив bool для диапазона дат;
arr_bool = (np.less_equal.outer(startMonth.start, range(1,13))
& np.greater_equal.outer(endMonth.end, range(1,13))
)
masked=df1.filter(regex='M_[0-9]').mask(~arr_bool)
Я попробовал это;
eql = (np.diff(np.hstack((masked.values, np.zeros((masked.values.shape[0], 1)))), axis=1) == 0).argmin(axis=1)
final_eql = pd.DataFrame(eql,
index=idx, columns=['eql'])
final_eql.eql= np.select( condlist = [startMonth.start > endMonth.end],
choicelist = [Neg99],
default = final_eql.eql)
Но для idx = 1006 (что всезначения равны нулю) Я не могу получить желаемый результат.
Я хочу получить эти результаты: ожидаемый результат:
1001 0
1002 0
1003 0
1004 0
1005 3
1006 11
1007 11
1008 0
1009 0
1010 0
1011 0
1012 0
1013 -999
Но я получаю эти результаты:
1001 0
1002 0
1003 0
1004 0
1005 3
1006 0
1007 11
1008 0
1009 0
1010 0
1011 0
1012 0
1013 -999