Процент создания столбцов от общего количества на основе ссылочных строк в списке Python DataFrame - PullRequest
1 голос
/ 27 февраля 2020

У меня есть фрейм данных, который по сути представляет собой некоторые индексы с сводной таблицей столбцов со значениями в строках 1 и 0. Один столбец «Итого» - это сумма единиц в данной строке. Имя каждого столбца является первым индексом элементов в списке, на который я ссылался. То, что я хотел бы сделать, это создать столбцы для процента от общего столбца, ссылающегося на эти столбцы и вытянуть третий индекс, который представляет собой строку, представляющую регион мира, такой как «Соединенные Штаты», «Германия» и др. c.

Кадр данных ниже:

Name     Total  Option1  Option2  Option3  Option4  Option5  Option6  Option7
Michael   4       1        0        0        1        0        1        1
Gerry     2       1        0        0        0        0        0        1

Список, на который ссылается кадр данных сводной таблицы

ids = [('Option1', '37i9dQZF1DX0XUsuxWHRQd', 'United States'), 
('Option2', '37i9dQZF1DX2RxBh64BHjQ', 'Germany'), 
('Option3', '37i9dQZF1DX5hR0J49CmXC', 'Denmark'), 
('Option4', '37i9dQZF1DX8f6LHxMjnzD', 'Australia'), 
('Option5', '37i9dQZF1DWSOkubnsDCSS', 'United Kingdom'), 
('Option6', '37i9dQZF1DX0QKpU3cGsyb', 'United States'), 
('Option7', '37i9dQZF1DX60OAKjsWlA2', 'United States')]

Ожидаемый вывод

Name     Total  %United States  %Germany   %Denmark   %Australia  %United Kingdom  Option1  Option2  Option3  Option4  Option5  Option6  Option7
Michael   4         .75             0          0          .25            0            1        0        0        1        0        1        1
Gerry     2          1              0          0           0             0            1        0        0        0        0        0        1

1 Ответ

1 голос
/ 27 февраля 2020

Вы можете сопоставить столбцы и группы:

# assuming that Name are unique
df = df.set_index('Name')

renamed = df.columns[1:].map(pd.DataFrame(ids).set_index(0)[2])

(df.iloc[:,1:].T
   .groupby(renamed).sum().T
   .div(df['Total'], axis=0)
   .assign(Total=df['Total'])
   .reset_index()
)

Вывод:

      Name  Australia  Denmark  Germany  United Kingdom  United States  Total
0  Michael       0.25      0.0      0.0             0.0           0.75      4
1    Gerry       0.00      0.0      0.0             0.0           1.00      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...