【问题标题】:Getting percentage for each column after groupby在groupby之后获取每列的百分比
【发布时间】:2019-04-09 05:09:49
【问题描述】:

我有一个带有两列 A 和 B 的 pandas 数据框。 B 列包含三个类别 X、Y、'Z'。我需要检查 A 中每个组的特定值的百分比是多少。这是数据框的样子:

  A   B
  AA  X 
  BB  Y
  CC  Z
  AA  Y
  AA  Y
  BB  Z 
  ..  ..

现在我想绘制一个堆叠图,但它应该是基于百分比的堆叠图,而不仅仅是基于 B 中每个类别的计数,对应于 A 中的一个组。这是我到目前为止所做的:

df.groupby(['A'])['B'].value_counts().unstack() 这给了我这个

B   X    Y      Z
A           
AA  65   666    5
BB  123  475    6
CC  267  1337   40

现在我想将每一列除以对应行的总和,例如第一行(65/(65+666+5), 666/(65+666+5), 5/(65+666+5),),并将结果绘制为堆积条形图。 有人可以帮忙吗?

【问题讨论】:

  • 有人问过类似的问题yesterday。只需将normalize=True 作为参数添加到value_counts
  • 是的,愚蠢的我。就这么容易。谢谢阿洛兹

标签: python python-3.x pandas data-visualization


【解决方案1】:

您可以像这样找到逐行总和并沿轴除:

freq_df = df.groupby(['A'])['B'].value_counts().unstack()
pct_df = freq_df.divide(freq_df.sum(axis=1), axis=0)

然后绘制你应该可以简单地使用

pct_df.plot(kind="bar", stacked=True)

【讨论】:

    【解决方案2】:

    我找到了一个行之有效的解决方案。

    步骤 1. 应用 groupby

    第 2 步。使用 value_count

    步骤 3. 使用 unstack

    第 4 步。乘以 100 并应用舍入函数。

    第 5 步。应用 fillna 方法为空值填充 0

    这里是代码

    df.groupby(['A'])['B']\
       .value_counts(normalize=True)\
       .unstack()\
       .mul(100)\
       .round(2)\
       .fillna(0)
    

    或者你也可以使用交叉表法

    步骤 1. 使用交叉表

    第 2 步。应用 lambda 函数。

    pd.crosstab(df["A"], df["B"])\
    .apply(lambda x: round(x / x.sum() * 100, 2), axis = 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-03
      • 2019-11-27
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2018-04-04
      • 2020-10-19
      相关资源
      最近更新 更多