То, что вы ищете, это метод с именем pivot
.
Но в этом случае он вам на самом деле не нужен - пример Bokeh, который вы связали, уже имеет дело с Поворотные данные, и поэтому он должен втирать их в приемлемую форму. В то время как с уже имеющейся формой данных вам не нужно много делать.
Ниже вы можете найти пример обоих подходов. Обратите внимание, насколько проще mk_src_2
.
import pandas as pd
from bokeh.io import show
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.plotting import figure
data = pd.DataFrame([['2020-01-01', 'Apple', 19],
['2020-01-01', 'Orange', 8],
['2020-01-01', 'Banana', 7],
['2020-02-23', 'Apple', 15],
['2020-02-23', 'Orange', 10],
['2020-02-23', 'Banana', 12],
['2020-02-24', 'Apple', 12],
['2020-02-24', 'Orange', 17],
['2020-02-24', 'Banana', 9]],
columns=['day', 'fruit', 'count'])
def mk_src_1(d):
# Pivoting implicitly orders values.
d = d.pivot(index='fruit', columns='day', values='count')
x = [(fruit, day) for fruit in d.index for day in d.columns]
counts = sum(d.itertuples(index=False), ())
return ColumnDataSource(data=dict(x=x, counts=counts))
def mk_src_2(d):
# Bokeh's FactorRange requires the X values to be ordered.
d = d.sort_values(['fruit', 'day'])
return ColumnDataSource(data=dict(x=list(zip(d['fruit'], d['day'])),
counts=d['count']))
# source = mk_src_1(data)
source = mk_src_2(data)
p = figure(x_range=FactorRange(*source.data['x']), plot_height=250, title="Fruit Counts by Year",
toolbar_location=None, tools="")
p.vbar(x='x', top='counts', width=0.9, source=source)
p.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = 1
p.xgrid.grid_line_color = None
show(p)