There is always a ColumnDataSource. If you pass a pandas data frame then Bokeh just creates one for you behind the scenes as a convenience. Creating a CDS yourself is useful if you want to share one data source between different plots or glyphs, refer to the data source in JS callbacks or other contexts, or have more control over which columns are in the data source.