Учитывая серию pandas, которая представляет частоты значения, как я могу превратить эти частоты в проценты?
Я экспериментировал с набором данных kaggle.com Titanic (данные о каждом человеке на "Титанике" ) и придумал разложение полов следующим образом:
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
Есть ли лучший (более идиоматический) способ?
Спасибо!
Ответы
Ответ 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 представляет собой серию)
Ответ 2
Думаю, что я, вероятно, сделаю это за один раз (без импорта подразделения):
1. * df.sex.value_counts() / len(df.sex)
или, возможно, помните, что хотите процент:
100. * df.sex.value_counts() / len(df.sex)
Большая часть мухны, на самом деле, ваш путь тоже выглядит хорошо.
Ответ 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
Я знаю, что это старый пост, но я надеюсь, что этот ответ поможет кому-то в будущем.
В случае, если вы хотите показать процент, вы можете использовать value_counts(normalize=True)
, как ответил выше @fanfabbb.
С учетом сказанного, для многих целей, вы можете показать это в процентах от ста. это может быть достигнуто так
gender = df.sex.value_counts(normalize=True).mul(100).round(1).astype(str) + '%'
В этом случае мы умножаем результаты на сто, округляем их до одного знака после запятой и добавляем знак процента.
Надеюсь, это может помочь :)