You can use groupby().transform()
to extract the min dates, then use boolean indexing:
df.loc[df.groupby([pd.Grouper(key='date', freq='M'),'id'])
.date.transform('min') == df['date']
]
That would give you the rows with minimum dates for each month. However, if you want exactly the first (e.g. oct 1st), you just need to check the day:
df.loc[df.date.dt.day==1]
CLICK HERE to find out more related problems solutions.