大熊猫:根据列中的多索引创建条形图

时间:2019-04-11 19:24:27

标签: python pandas matplotlib seaborn

我想用seaborn(matplotlib也很好)从我的DataFrame创建一个barplot。

但是从文档来看,barplot function需要一个看起来像这样的值列表: enter image description here

然后您可以使用以下方式进行绘制:

tips = sns.load_dataset("tips")
sns.barplot(x="day", y="total_bill", hue="sex", data=tips)

我的数据看起来不一样,我在各列中创建了一个multi_index。由于我无法发布原始数据,因此以下是有关如何查找提示数据集的模型:

enter image description here

下面是创建上述数据框的代码:

index_tuples=[]

for sex in ["Male", "Female"]:
    for day in ["Sun", "Mon"]:
        index_tuples.append([sex, day])

index = pd.MultiIndex.from_tuples(index_tuples, names=["sex", "day"])

dataframe = pd.DataFrame(columns = index)

total_bill = {"Male":{"Sun":5, "Mon":3},"Female":{"Sun":10, "Mon":5}}
dataframe = dataframe.append(pd.DataFrame.from_dict(total_bill).unstack().rename('total_bill'))

现在,我的问题是:如何从该多索引创建条形图? 该解决方案应正确地对条进行分组,就像hue参数的seaborn一样。简单地将数据作为数组获取并将其传递给matplotlib是行不通的。

到目前为止,我的解决方案是通过重复堆叠DataFrame将多索引转换为列。像这样:

stacked_frame = dataframe.stack().stack().to_frame().reset_index()

这将导致seaborn期望的数据布局:

enter image description here

您可以使用

进行绘制
sns.barplot(x="day", y=0, hue="sex", data=stacked_frame)
plt.show()

enter image description here

我可以直接从多重索引创建条形图吗?

1 个答案:

答案 0 :(得分:0)

这是您要寻找的吗?

idx = pd.MultiIndex.from_product([['M', 'F'], ['Mo', 'Tu', 'We']], names=['sex', 'day'])
df = pd.DataFrame(np.random.randint(2, 10, size=(idx.size, 1)), index=idx, columns=['total bill'])
df.unstack(level=0)['total bill'].plot(
    kind='bar'
)
plt.ylabel('total bill');

enter image description here