Сгруппируйте по номеру месяца и найдите последнюю запись:
df.Date = pd.to_datetime(df.Date, errors='coerce')
df.groupby(df.Date.dt.month).last()
Date Portfolio Value
Date
7 2016-07-29 1022491.0
8 2016-08-26 1032567.0
9 2016-09-30 1010388.0
10 2016-10-28 981637.3
11 2016-11-25 1009625.0
Если строки не отсортированы по дате, сначала вызовите sort_values
:
df.sort_values('Date').groupby(df.Date.dt.month).last()
Date Portfolio Value
Date
7 2016-07-29 1022491.0
8 2016-08-26 1032567.0
9 2016-09-30 1010388.0
10 2016-10-28 981637.3
11 2016-11-25 1009625.0
Должно работать вв любом случае.
Если у вас есть даты, охватывающие несколько лет, лучше сгруппировать их по году-месяцу:
df.sort_values('Date').groupby([df.Date.dt.year, df.Date.dt.month]).last()