Предположим, у меня есть следующий набор данныхНакопительное сумма с отсутствующими категорий в панд
df_dict = ({'unit' : [1, 1, 1, 2, 2, 2], 'cat' : [1, 2, 3, 1, 2, 4],
'count' : [8, 3, 2, 2, 8, 7] })
df = pd.DataFrame(df_dict)
df.set_index('unit', inplace = True)
который выглядит следующим образом:
cat count
unit
1 1 8
1 2 3
1 3 2
2 1 2
2 2 8
2 4 7
Отсчет дает частоту, в которой различные категории, где наблюдаемые в блоке. То, что я хотел бы получить, - это совокупная частота четырех категорий для каждой единицы. Обратите внимание, что категория 4 отсутствует из блока 1 и 3-й категории отсутствует блок 2.
Таким образом, конечный результат будет
для блока 1:
[8/13, 11/13, 13/13, 13/13]
и для блока 2:
[2/17, 10/17, 10/17, 17/17]
Я знаю, как получить накопленную сумму с groupby
и cumsum
, но затем блок 1, например, не имеет значения для недостающей категории 4.
Спасибо за ваше время!
Спасибо, действительно хорошее решение !! Мне все равно нужно обернуть голову вокруг значений, связанных с вещью индекса ... Один быстрый вопрос: зачем вам нужно использовать '.values' в' cumsum(). Values'? Я не понимаю, что это делает. – cd98
Внутри 'lambda' функция' x' является DataFrame. 'x ['count']. cumsum()' - это серия. У этой серии есть свой индекс, который я бы хотел заменить на 'x ['cat']'. Если мы используем 'pd.Series (x ['count']. Cumsum(), index = x ['cat'])', то возникает исключение 'ValueError: not reindex ...', потому что исходная серия имеет дубликат записи в его индексе - так что неясно, как сопоставить старый индекс с новым индексом. Каждая серия имеет атрибут 'values', который возвращает базовые данные в виде массива NumPy. Все, о чем мы заботимся, это данные, а не исходный индекс, поэтому я использовал '.values' для сбора данных. – unutbu
Получил, спасибо! – cd98