首页 > 解决方案 > 每周按计数对枢轴图进行排序

问题描述

绘制以下数据集时:

date = ['2/18/2019','2/18/2019','2/18/2019','2/18/2019','2/25/2019','2/25/2019','2/25/2019','2/25/2019','3/4/2019','3/4/2019','3/4/2019','3/4/2019',
        '3/11/2019','3/11/2019','3/11/2019','3/11/2019','3/18/2019','3/18/2019','3/18/2019','3/18/2019']
name = ['P','L','E','N','P','L','E','N','P','L','E','N','P','L','E','N','P','L','E','N']
count = [0,0,0,0,0,0,0,0,1,5,0,0,1,7,1,2,2,7,1,2]
df = pd.DataFrame({'date': date, 'name': name, 'count':count}).sort_values(['date','count'],ascending=[True, False])

我想每周保持订单,即。在每周内,值应按计数排序,例如 3/18 我们应该先有 L,然后是 P 或 N,然后是 E。

但是,旋转后顺序会中断,并且在绘制时会按字母顺序显示数据。有什么方法可以让它在每周内按计数绘制?

piv = df.pivot(index='date', columns='name', values='count')
piv = piv.reset_index(level=piv.index.names)
piv.plot(kind='bar', stacked=True, rot=0, grid=True)

标签: pythonpandasmatplotlib

解决方案


列的顺序是条的堆叠方式。如果您的数据透视表中有 E、L、N、P,那将是系列的顺序(当前代码)。您可以更改此顺序,但所有柱将具有相同的顺序。这是一个按字母组计数对条形排序的示例(即 E = 2)

piv = df.pivot(index='date', columns='name', values='count')
piv = piv.reset_index(level=piv.index.names)
cols = ["date"] + piv[list("ELPN")].sum().sort_values(ascending=False).keys().tolist()
piv = piv[cols]
piv.plot(kind='bar', stacked=True, rot=0, grid=True)

在此处输入图像描述

在此处输入图像描述

我怀疑您希望每个酒吧都有不同的顺序。我不相信 Pandas 可以做到这一点,但它可能可以直接用 matplotlib 完成。


推荐阅读