【问题标题】:Given a pandas Series that represents frequencies of a value, how can I turn those frequencies into percentages?给定一个代表值频率的熊猫系列,我如何将这些频率转换为百分比?
【发布时间】:2021-12-05 09:33:07
【问题描述】:

我正在尝试使用 kaggle.com 的泰坦尼克号数据集(泰坦尼克号上每个人的数据)并得出这样的性别分类:

df = pd.DataFrame({'sex': ['male'] * 577 + ['female'] * 314})
gender = df.sex.value_counts()
gender

male   577
female 314 

我想知道泰坦尼克号上每种性别的百分比。

我的方法不太理想:

from __future__ import division
pcts = gender / gender.sum()
pcts

male      0.647587
female    0.352413

有没有更好(更惯用)的方式?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这个函数在 pandas 中实现,实际上甚至在 value_counts() 中。不用计算:)

    只需输入:

    df.sex.value_counts(normalize=True)
    

    它给出了所需的输出。

    请注意 value_counts() 不包括 NA 值,因此数字加起来可能不等于 1。 见这里:http://pandas-docs.github.io/pandas-docs-travis/generated/pandas.Series.value_counts.html (DataFrame的一列是一个Series)

    【讨论】:

    • 下面给出male 577 0.647587 female 314 0.352413 的任何东西都可以并排计数和pctcnts ??
    【解决方案2】:

    如果您希望显示百分比,您可能会做的事情之一是将value_counts(normalize=True) 用作answered by @fanfabbb

    话虽如此,出于多种目的,您可能希望以百分之一的形式显示它。

    可以这样实现:

    gender = df.sex.value_counts(normalize=True).mul(100).round(1).astype(str) + '%'
    

    在这种情况下,我们将multiply 的结果以百为单位,round 保留一位小数并添加百分号。

    【讨论】:

      【解决方案3】:

      如果你想用百分比合并计数,可以使用:

      c = df.sex.value_counts(dropna=False)
      p = df.sex.value_counts(dropna=False, normalize=True)
      pd.concat([c,p], axis=1, keys=['counts', '%'])
      

      【讨论】:

      • 应该有一个自动显示的选项!
      【解决方案4】:

      我想我可能会一口气做到这一点(不导入部门):

      1. * df.sex.value_counts() / len(df.sex)
      

      或者,记住你想要一个百分比:

      100. * df.sex.value_counts() / len(df.sex)
      

      真的很多,你的方式看起来也不错。

      【讨论】:

      • 我喜欢这种方法,因为不需要导入 future。谢谢海登。
      猜你喜欢
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多