归一化和绘制按第 4 列分组的 3 列数据

Normalizing and Plotting Data of 3 Columns Grouped by 4th Column

我的dataframe如下,link快速.csv。值 ab 也可以视为 truefalse.

+------+------+------+--------+
| COl1 | COl2 | COl3 | Group  |
+------+------+------+--------+
| a    | b    | a    | Yellow |
| b    | b    | a    | Blue   |
| a    | a    | b    | Red    |
| a    | b    | a    | Red    |
| a    | a    | b    | Yellow |
| b    | b    | a    | Blue   |
| b    | b    | a    | Yellow |
| a    | a    | b    | Blue   |
| a    | b    | a    | Red    |
| b    | a    | b    | Blue   |
| b    | b    | a    | Yellow |
| a    | a    | a    | Blue   |
| b    | a    | b    | Red    |
+------+------+------+--------+

我想要一个按第四列分组的前三列的条形图。前三列中的数据是分类数据,我希望得到它们的标准化计数。所有三列中的类别数(即值 ab)相同。在单列的情况下,我通常会规范化为:

df_grouped = df_main.groupby('Group')['COL1'].value_counts(normalize=True)*100

但是,当我尝试使用下面的代码对列进行分组时,我无法在将其绘制为条形图之前将计数标准化:

df_grouped = df_main.groupby('Group')['COL1', 'COL2', 'COL3'].count().reset_index()
df_grouped.plot.bar() 

如果可能的话,像下面这样在图中分组会很好: 感谢您的帮助。

由于您的数据是二进制的,您可以像这样使用 groupby

(df.iloc[:,:-1].eq('a')          # `True` class
   .groupby(df['Group']).mean()
   .plot.bar()
)

输出:

如果您需要更深入地研究每个 COL,还可以获得虚拟对象、groupby 和 plot

df1=pd.get_dummies(df, columns=['COl1','COl2','COl3'])
(df1.groupby('Group').mean()*100).plot(kind='bar')