У меня есть фрейм данных из нескольких тысяч строк со столбцами географии, response_dates и True/False для in_compliance.
df = pd.DataFrame( {
"geography" : ["Baltimore", "Frederick", "Annapolis", "Hagerstown", "Rockville" , "Salisbury","Towson","Bowie"] ,
"response_date" : ["2018-03-31", "2018-03-30", "2018-03-28", "2018-03-28", "2018-04-02", "2018-03-30","2018-04-07","2018-04-02"],
"in_compliance" : [True, True, False, True, False, True, False, True]})
Я хочу добавить столбец, представляющий количество значений True для последних четырех дат в столбце response_date, включая response_date для этой строки. Пример желаемого результата:
geography response_date in_compliance Past df1 = df.groupby(['city']).apply(lambda x: x.set_index('response_date').resample('1D').first())
df2 = df1.groupby(level=0)['in_compliance']\
.apply(lambda x: x.shift().rolling(min_periods=1,window=4).count())\
.reset_index(name='Past_4_dates_sum_of_true')
dates_sum_of_true
Baltimore 2018-03-24 True 1
Baltimore 2018-03-25 False 1
Baltimore 2018-03-26 False 1
Baltimore 2018-03-27 False 1
Baltimore 2018-03-30 False 0
Baltimore 2018-03-31 True 1
Baltimore 2018-04-01 True 2
Baltimore 2018-04-02 True 3
Baltimore 2018-04-03 False 3
Baltimore 2018-04-06 True 3
Baltimore 2018-04-07 True 3
Baltimore 2018-04-08 False 2
Я пробовал разные подходы к группировке и прокатке. Но я получаю результаты, которые не являются теми, которые я ожидаю и которые мне нужны.
df.groupby('city').resample('d').sum().fillna(0).groupby('city').rolling(4,min_periods=1).sum()
Это был еще один подход, который я использовал:
df1 = df.groupby(['city']).apply(lambda x: x.set_index('response_date').resample('1D').first())
df2 = df1.groupby(level=0)['in_compliance']\
.apply(lambda x: x.shift().rolling(min_periods=1,window=4).count())\
.reset_index(name='Past_4_dates_sum_of_true')