如何用Bokeh简洁绘制Pandas GroupBy分组对象?
简洁实现Bokeh按动态分组绘制折线图
当然有简洁的实现方式!针对分组数量不固定的场景,我们可以利用Pandas分组的遍历特性,结合Python的列表推导式来一行搞定所有分组的折线绘制,完全不用手动为每个分组写单独的p.line()语句。
实现代码
from pandas import DataFrame from bokeh.plotting import figure data = dict(x = [0,1,2,0,1,2], y = [0,1,2,4,5,6], g = [1,1,1,2,2,2]) df = DataFrame(data) p = figure() # 一行代码完成所有分组的折线绘制 _ = [p.line('x', 'y', source=group) for _, group in df.groupby('g')]
代码解释
df.groupby('g')会返回一个可迭代的分组对象,每次迭代会给出分组键(这里用_占位,因为我们暂时不需要用到分组的标识)和对应的分组数据子集(group)。- 列表推导式会自动遍历所有分组,对每个分组调用
p.line()绘制折线,完全适配分组数量动态变化的场景。 - 用
_接收推导式生成的列表,是因为我们不需要保存每个p.line()返回的Line对象,只是执行绘制操作而已。
如果需要给不同分组的折线设置不同样式(比如颜色、线型),也可以在推导式里扩展,比如:
colors = ['blue', 'red', 'green'] # 颜色数量可匹配分组数 _ = [p.line('x', 'y', source=group, color=colors[i]) for i, (_, group) in enumerate(df.groupby('g'))]
内容的提问来源于stack exchange,提问作者Primo Petri
相关产品推荐
相关产品推荐

