Here the best is create dictionary:
df['Date'] = pd.to_datetime(df['Date'])
d = dict(tuple(df.groupby(df['Date'].dt.month)))
print (d)
{9:    Col1  Col2       Date  Val
1    13    78 2018-09-21    4, 10:    Col1  Col2       Date  Val
2    14    82 2018-10-28    5
4    17    35 2018-10-23    9, 11:    Col1  Col2       Date  Val
0    12    23 2018-11-20    4
3    15    22 2018-11-10    8}
print (d[9])
   Col1  Col2       Date  Val
1    13    78 2018-09-21    4
Or:
d = dict(tuple(df.groupby(df['Date'].dt.strftime('%b'))))
print (d)
{'Nov':    Col1  Col2       Date  Val
0    12    23 2018-11-20    4
3    15    22 2018-11-10    8, 'Oct':    Col1  Col2       Date  Val
2    14    82 2018-10-28    5
4    17    35 2018-10-23    9, 'Sep':    Col1  Col2       Date  Val
1    13    78 2018-09-21    4}
print (d['Nov'])
   Col1  Col2       Date  Val
0    12    23 2018-11-20    4
3    15    22 2018-11-10    8
It is not recommended, but possible create DataFrames by groups:
for i, g in df.groupby(df['Date'].dt.strftime('%b')):
    globals()['df_' + str(i)] =  g
print (df_Nov)
   Col1  Col2       Date  Val
0    12    23 2018-11-20    4
3    15    22 2018-11-10    8
If need aggregate by months:
df.groupby(df['Date'].dt.month).sum()
Or:
df.groupby(df['Date'].dt.strftime('%b')).sum()