print(df.groupby(['ID', 'Cluster']).Product.apply(lambda x: x.tolist()
    ).reset_index().to_dict(orient='list'))
{'Cluster': [4, 7, 5, 7], 'ID': [1, 2, 3, 4], 'Product': [['b', 'f', 'w'],
    ['u', 'b'], ['h', 'f', 'm', 'd'], ['s', 'b', 'g']]}
Pandas df manipulation: new column with list of values if other column rows repeated