PythonPandas图(百分比)

oknwwptz  于 2022-11-27  发布在  Python
关注(0)|答案(1)|浏览(141)

我有如下的州和类的数据。我试图用matplotlib绘制总数和不同的百分比。

data = [['FL', 2], ['AR', 0], ['CA', 0], ['CA', 1], ['AR', 1], ['FL', 0], ['CA', 0], ['CA', 1], ['AR', 2], ['FL', 1], 
        ['AR', 0], ['FL', 2], ['CA', 1], ['FL', 1], ['AR', 1], ['AR', 2], ['AR', 1], ['FL', 2], ['CA', 2], ['FL', 0], 
        ['FL', 2], ['AR', 2], ['AR', 1], ['FL', 0], ['AR', 1], ['CA', 0], ['CA', 0], ['CA', 2]]
columns = ['State', 'Class']
df = pd.DataFrame(data=data, columns=columns)
df.groupby(['State', 'Class']).size()

使用以下代码绘制计数:

df.groupby(['State', 'Class']).size().to_frame('Size').unstack(level=-1).sort_values([('Size', 0)], ascending=False).plot(kind='bar', rot=45, figsize=(8,8), fontsize=10)
plt.legend(['Class 0', 'Class 1', 'Class 2'], prop ={'size' : 15})

同样,百分比(州水平、班级水平和总体水平)也需要绘制出来。

  • 图1:X轴上的状态和Y轴上的“大小”的状态水平百分比,每个类别的条形图都有颜色(即,每个状态3个条形图)
  • 图2:x轴上的类和y轴上的“大小”的类级别百分比,每个状态的条带颜色(即,每个类51条)
  • 图3:与图1相同,y轴为“尺寸”的总体百分比。

你能帮我用优雅的方法来完成吗?
下面是我目前的解决方案。需要绘制StatePercent、ClassPercent和OverallPercent(图#3)。我的愿望是生成这3个图而不创建列,就像对“Size”(图#2)所做的那样。(在实际的数据框中,我有100多个其他列;因此,如果可能的话,寻找不创建不必要的列的选项。这三个列只用于统计,而不用于任何处理)
图1- Dataframe x1c 0d1x
图#2-在df

中绘制“Size”而不创建列
图#3-需要绘制StatePercent、ClassPercent和OverallPercent值,计算如下

yh2wf1be

yh2wf1be1#

我想你的术语是这样定义的。
1.状态S和类C的状态级别百分比= 100 *(状态S和类C的记录数)/(类C和所有状态的记录数)
1.状态S和类C的类级别百分比= 100 *(状态S和类C的记录数)/(状态S和所有类的记录数)
1.状态S和类C的总百分比= 100 *(状态S和类C的记录数)/(所有状态和所有类的记录数)
您可以使用apply()sum(),如下例所示。

df0 = df.groupby(['State', 'Class']).size().to_frame('Size')
df1 = df0.unstack(level=1).apply(lambda row: 100*row/sum(row), axis=1)
df2 = df0.unstack(level=0).apply(lambda row: 100*row/sum(row), axis=1)
df3 = 100*df0.unstack(level=1)/df0.sum().sum()

您可以分别绘制案例1、2和3的df1、df2和df3。

相关问题