Instead of varying number of columns per object you would have varying number of rows per object
pd.DataFrame({'ClusterID' : '1a,1b,2a,2b,2c,2d,3a'.split(','), 'ObjectID' : [1,1,2,2,2,2,3]})
ObjectID ClusterID
0 1 1a
1 1 1b
2 2 2a
3 2 2b
4 2 2c
5 2 2d
6 3 3a
If each cluster has multiple attributes, you could store them in a separate table as below. This would allow multiple objects to share clusters without having to replicate data
pd.DataFrame({'ClusterID' : '1a,1b,2a,2b,2c,2d,3a'.split(','), 'ClusterAttr-1' : 'Attr-1', 'ClusterAttr-2' : 'Attr-2'})
ClusterID ClusterAttr-1 ClusterAttr-2
0 1a Attr-1 Attr-2
1 1b Attr-1 Attr-2
2 2a Attr-1 Attr-2
3 2b Attr-1 Attr-2
4 2c Attr-1 Attr-2
5 2d Attr-1 Attr-2
6 3a Attr-1 Attr-2