Вычисление частоты встречаемости без скрытия строк

#python #pandas #dataframe

Вопрос:

Мне нужны некоторые рекомендации по вычислению частоты в кадре данных.

В принципе, мне нужно рассчитать частоту появления столбца, создав новый столбец с найденным процентом, основываясь на простом условии другого столбца:

Например:

Указатель Col1 Col9
0 a 49
1 a 51
2 b 49
3 b 49
4 c 51
5 c 49
6 c 49
7 c 51

Я добавлю новый столбец в процентах, где условие будет, например (Col9 gt; 50), в зависимости от количества строк в Col1

Указатель Col1 Col9 Процентное соотношение
0 a 49 50%
1 a 51 50%
2 b 49 0%
3 b 49 0%
4 c 51 25%
5 c 49 25%
6 c 49 25%
7 c 49 25%
  • Для случая «а» Col1 (2 случая) у нас есть 50% с Col9 gt; 50.
  • Для вхождения «b» Col2 (2 вхождения) у нас есть 0 с Col9 gt; 50.
  • Для появления «c» Col3 (4 случая) у нас есть 25% с Col9 gt; 50.

Сложность заключается в том, чтобы пометить все строки фрейма данных в столбце «Новый процент» определенным процентом правила. Я хочу, чтобы все строки в их новом столбце процентов сообщали мне, что в определенной группе (например, «а») есть X%, которые подпадают под правило.

Некоторые параметры группировки уменьшают количество строк в моем фрейме данных, так как они подсчитываются и скрываются, чтобы не повторять отображение в процентах. Но в моем случае мне нужны все строки и столбцы.

Мне нужны все столбцы, включая процент.

 df = df.sort_values(['index', 'Col1'], ascending = (True, True)) df = df.groupby(['index', 'Col1']['Col9'].apply(lambda x: (some rule like Col9 gt; 50).reset_index(name='Percentual')  

Я бы упорядочил фрейм данных по «индексу» и «Col1». Но я не могу сохранить все строки и указать процент так, как я хочу.

Ответ №1:

assign сделал бы эту работу за тебя. Важно сначала установить столбец «сводный» в качестве индекса:

 import pandas as pd  df = pd.DataFrame({"col1":["a", "a", "b", "b", "c", "c", "c", "c"], "col9":[49, 51, 49, 49, 51, 49, 49, 49]})  grouping_index = ["col1"] df = df.set_index(grouping_index)  df = df.assign(percentage=df.groupby(grouping_index)[["col9"]].agg(lambda x: sum(xgt;50)/len(x))).reset_index()