问题描述
我有一个融合了以下内容的多索引数据框:
I have a multi-index dataframe that I've melted to look something like this:
Color Frequency variable value Red 2-3 times a month x 22 Red A few days a week x 45 Red At least once a day x 344 Red Never x 5 Red Once a month x 1 Red Once a week x 0 Red Once every few months x 4 Blue 2-3 times a month x 4 Blue A few days a week x 49 Blue At least once a day x 200 Blue Never x 7 Blue Once a month x 19 Blue Once a week x 10 Blue Once every few months x 5 Red 2-3 times a month y 3 Red A few days a week y 97 Red At least once a day y 144 Red Never y 4 Red Once a month y 0 Red Once a week y 0 Red Once every few months y 4 Blue 2-3 times a month y 44 Blue A few days a week y 62 Blue At least once a day y 300 Blue Never y 2 Blue Once a month y 4 Blue Once a week y 23 Blue Once every few months y 6 Red 2-3 times a month z 4 Red A few days a week z 12 Red At least once a day z 101 Red Never z 0 Red Once a month z 0 Red Once a week z 10 Red Once every few months z 0 Blue 2-3 times a month z 100 Blue A few days a week z 203 Blue At least once a day z 299 Blue Never z 0 Blue Once a month z 0 Blue Once a week z 204 Blue Once every few months z 100
我正在尝试x轴上有两个类别的变量$ 和频率,并且色相基于颜色。此外,我希望y轴是值在该变量的值总和中所占的比例每个颜色;例如变量每月x.2-3次的y值应为22 /(22 + 45 + 344 + 5 + 1 + 0 + 4)或5.22%。
I'm trying to make a seaborn plot where there are two categories for the x-axis variable and Frequency and the hue is based on Color. Moreover, I want the y-axis to be the proportion of value over the sum of the values for that variable for each Color; e.g. the y-value for variable "x.2-3 times a month" should be 22/(22+45+344+5+1+0+4) or 5.22%.
到目前为止,我有这个:
So far I have this:
import seaborn as sns fig, ax1 = plt.subplots(figsize=(20, 10)) sns.factorplot(x='variable',y='value', hue='Frequency', data=df, kind='bar', ax=ax1)
这是其中的一部分。如何对1)颜色和2)对每个变量&取值的比例进行分组。 频率,而不是计数?
This is part of the way there. How do I also groupby 1) Color and 2) take the proportion of values for each variable & Frequency, rather than the count?
推荐答案
这就是您需要的找出该组每个数字的一部分:
This is what you need to find the portion of each number for that group:
df['proportion'] = df['value'] / df.groupby(['Color','variable'])['value'].transform('sum')
输出:
variable Frequency Color value portion 0 x 2-3 times a month Red 22 0.052257 1 x A few days a week Red 45 0.106888 2 x At least once a day Red 344 0.817102 3 x Never Red 5 0.011876 4 x Once a month Red 1 0.002375 5 x Once a week Red 0 0.000000 6 x Once every few months Red 4 0.009501 7 x 2-3 times a month Blue 4 0.013605 8 x A few days a week Blue 49 0.166667 9 x At least once a day Blue 200 0.680272 10 x Never Blue 7 0.023810 11 x Once a month Blue 19 0.064626 12 x Once a week Blue 10 0.034014 13 x Once every few months Blue 5 0.017007 14 y 2-3 times a month Red 3 0.011905 15 y A few days a week Red 97 0.384921 16 y At least once a day Red 144 0.571429 17 y Never Red 4 0.015873 18 y Once a month Red 0 0.000000 19 y Once a week Red 0 0.000000 20 y Once every few months Red 4 0.015873 21 y 2-3 times a month Blue 44 0.099773 22 y A few days a week Blue 62 0.140590 23 y At least once a day Blue 300 0.680272 24 y Never Blue 2 0.004535 25 y Once a month Blue 4 0.009070 26 y Once a week Blue 23 0.052154 27 y Once every few months Blue 6 0.013605 28 z 2-3 times a month Red 4 0.031496 29 z A few days a week Red 12 0.094488 30 z At least once a day Red 101 0.795276 31 z Never Red 0 0.000000 32 z Once a month Red 0 0.000000 33 z Once a week Red 10 0.078740 34 z Once every few months Red 0 0.000000 35 z 2-3 times a month Blue 100 0.110375 36 z A few days a week Blue 203 0.224062 37 z At least once a day Blue 299 0.330022 38 z Never Blue 0 0.000000 39 z Once a month Blue 0 0.000000 40 z Once a week Blue 204 0.225166 41 z Once every few months Blue 100 0.110375
这篇关于Seaborn和Pandas:使用python中的多索引数据制作多个x类别条形图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!