Python/Pandas преобразуют сводную таблицу в проценты на основе общего количества строк

Я думаю, что это должно быть просто, но в Python я просто не могу понять, как взять сводную таблицу и получить проценты на основе сумм строк.

Сводная таблица:

df.pivot_table(index='Name', columns='scenario',
               values='y', aggfunc=np.count_nonzero, margins=True, margins_name='Total').fillna(0)

Что получает:

Python/Pandas преобразуют сводную таблицу в проценты на основе общего количества строк

Но я хочу, чтобы каждая ячейка была разделена на итоги строк:

Python/Pandas преобразуют сводную таблицу в проценты на основе общего количества строк

Как я могу это сделать? Заранее спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Вы можете использовать метод .pipe в сочетании с .div, чтобы выполнить это деление по столбцам во всех столбцах.
  2. Затем вы можете использовать .applymap, чтобы применить форматирование строки к каждому из ваших значений, чтобы значения отображались в процентах (обратите внимание, что они становятся строками и больше не являются математически полезными)
out = (
    df.pivot_table(
        index='Name', columns='scenario', values='y', 
        aggfunc=np.count_nonzero, margins=True, 
        margins_name='Total', fill_value=0
    )
    .pipe(lambda d: d.div(d['Total'], axis='index'))
    .applymap('{:.0%}'.format)
)

пример

df = pd.DataFrame({
    'a': [1, 0, 0, 1, 5],
    'b': [20, 20, 10, 50, 15], 
   'c': [50, 20, 50, 100, 20]
})

print(df)
   a   b    c
0  1  20   50
1  0  20   20
2  0  10   50
3  1  50  100
4  5  15   20


out = (
    df.pipe(lambda d: d.div(d['c'], axis='index'))
    .applymap('{:.0%}'.format)
)

print(out)
     a     b     c
0   2%   40%  100%
1   0%  100%  100%
2   0%   20%  100%
3   1%   50%  100%
4  25%   75%  100%

Замечательно, это сработало идеально. Полезно знать о функции трубы. Это будет удобно. И спасибо за fill_value=0 внутри основной операции.

Jean Picard 17.03.2022 19:18

Другие вопросы по теме