如何替换 Bokeh DataTable 中的索引列?

How do you replace the index column in Bokeh DataTable?

我在 Bokeh 中创建了一个 DataTable,但它没有显示索引列:

我希望在左侧有“索引”列:

这是我的代码:

evolution_data = treatcriteria_daily_data_table.groupby(['startdate_dayweek','startdate_weekyear'],as_index = False).sum().pivot('startdate_dayweek','startdate_weekyear').fillna(0)

evolution_data = evolution_data.droplevel(0,1)

evolution_data.loc['Total'] = evolution_data.sum()
evolution_data['Index'] = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche', 'Total']
evolution_data.set_index('Index', inplace=True, drop=True)

# remove the last week if there is not all the data 
evolution_data = evolution_data.loc[:, ~(evolution_data == 0.).any()]

evolution_two_last_weeks = []

nb_cols = len(evolution_data.columns)
diff_cpu_2_last_weeks = evolution_data.iat[7, nb_cols - 1] - evolution_data.iat[7, nb_cols - 2]

for i in range(0,7):
    daily_evolution = (data_2_weeks_before_the_last.iat[1,i] - data_2_weeks_before_the_last.iat[0,i]) / diff_cpu_2_last_weeks
    evolution_two_last_weeks.append(daily_evolution)

variation_of_total = (data_2_weeks_before_the_last.iat[1,7] - data_2_weeks_before_the_last.iat[0,7]) / data_2_weeks_before_the_last.iat[0,7]

daily_variations_dict = {"Lundi": evolution_two_last_weeks[0],
                            "Mardi": evolution_two_last_weeks[1],
                            "Mercredi": evolution_two_last_weeks[2],
                            "Jeudi": evolution_two_last_weeks[3],
                            "Vendredi": evolution_two_last_weeks[4],
                            "Samedi": evolution_two_last_weeks[5],
                            "Dimanche": evolution_two_last_weeks[6],
                            "Total": variation_of_total}


# remove decimals in the table
cols = evolution_data.columns
evolution_data[cols] = evolution_data[cols].applymap(np.int64)

evolution_data['% évolution des 2 dernières semaines'] = evolution_data.index.map(mapper=(lambda x: daily_variations_dict[x]))

evolution_data['% évolution des 2 dernières semaines'] = pd.Series(["{0:.2f}%".format(val*100) for val in evolution_data['% évolution des 2 dernières semaines']], index = evolution_data.index)


print(evolution_data)

Columns = [TableColumn(field=Ci, title=Ci) for Ci in evolution_data.columns] # bokeh columns
data_table = DataTable(columns=Columns, source=ColumnDataSource(evolution_data)) # bokeh table

show(data_table)

如何显示索引列(带有日期名称)而不是行号?谢谢。

正如评论中所说,Bokeh 不支持更改始终固定的第一列,并指示基于 0 的行号。然而,在幕后,Bokeh 使用了允许此功能的 SlickGrid,但此解决方案过于复杂,因为您需要先在 Bokeh 模型中找到对 SlickGrid 对象的引用,然后替换页面加载后 JavaScript 中的第一列。

更简单的方法是使用 index_position = None 隐藏第一列,这样您就可以 data_table = DataTable(... , index_position = None) 然后从 DataFrame 添加 Index 数据第一个到 table 的列。它现在不存在的原因是 df.columns 不包含您需要的索引列。所以尝试:

cols.insert(0, 'Index')
data_table = DataTable(columns=Columns, 
                       source=ColumnDataSource(evolution_data), 
                       index_position = None) # add this line