90

我正在尝试使用 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

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

4

4 回答 4

202

这个函数是在 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 的一列是一个系列)

于 2014-06-11T16:20:07.420 回答
19

如果要将计数与百分比合并,可以使用:

c = df.sex.value_counts(dropna=False)
p = df.sex.value_counts(dropna=False, normalize=True)
pd.concat([c,p], axis=1, keys=['counts', '%'])
于 2018-12-08T03:53:20.007 回答
19

如果您希望显示您可能做的事情之一的百分比,请value_counts(normalize=True)按照@fanfabbb 的回答使用。

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

可以这样实现:

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

在这种情况下,我们将结果乘以百,四舍五入到小数点后加上百分号。

于 2019-10-17T14:28:25.753 回答
15

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

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

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

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

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

于 2013-01-12T05:52:47.133 回答