Панды: создать барплот из мультииндексов в столбцах - PullRequest
1 голос
/ 11 апреля 2019

Я бы хотел использовать seaborn (было бы неплохо использовать matplotlib) для создания барплота из моего DataFrame.

Но, судя по документам, функция barplot ожидает списокзначения, которые выглядят следующим образом: 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 голосов
/ 11 июля 2019

Это то, что вы ищете?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...