Как расплавить фрейм данных, чтобы повторяющиеся элементы становились значениями, соответствующими индексу

У меня есть этот фрейм данных:

df = pd.DataFrame({'Status':['CO','AD','AD','AD','OT','CO','OT','AD'],
                   'Mutation':['H157Y','R47H','R47H','R67H','R62H','D87N','D39E','D39E']})
print(df)
  
  Status Mutation
0     CO    H157Y
1     AD     R47H
2     AD     R47H
3     AD     R67H
4     OT     R62H
5     CO     D87N
6     OT     D39E
7     AD     D39E

Я хочу, чтобы датафрейм выглядел так:

df2 = pd.DataFrame({'Status':['CO','AD','OT'],'H157Y':[1,0,0],'R47H':[0,2,0],'R67H':[0,1,0],
                    'R62H':[0,0,1],'D87N':[1,0,0],'D39E':[1,0,1]})
print(df2)

  Status  H157Y  R47H  R67H  R62H  D87N  D39E
0     CO      1     0     0     0     1     1
1     AD      0     2     1     0     0     0
2     OT      0     0     0     1     0     1

Где мутации — это имена столбцов, а их значения — количество попаданий — соответствуют статусу.

Мне кажется, это перекрестная таблица. pd.crosstab документы: pandas.pydata.org/docs/reference/api/pandas.crosstab.html См. также сообщение SO о повороте, часть 9: stackoverflow.com/questions/47152691/…

Chrysophylaxs 08.02.2023 20:33

Это звучит как crosstab вопрос.

Quang Hoang 08.02.2023 20:42

А как насчет df2 = df.pivot_table(index='Status', columns='Mutation', aggfunc='size', fill_value=0) df2 = df2.reset_index().rename_axis(None, axis=1) ?

Sunderam Dubey 08.02.2023 20:42

Однозначно crosstab + reset_index

mozway 08.02.2023 20:49
Почему в 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
4
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мы можем использовать pd.crosstab, как показано ниже:

>>> pd.crosstab(df["Status"], df["Mutation"])

Mutation  D39E  D87N  H157Y  R47H  R62H  R67H
Status                                       
AD           1     0      0     2     0     1
CO           0     1      1     0     0     0
OT           1     0      0     0     1     0

Или мы можем использовать столбцы pd.get_dummies , pandas.DataFrame.groupby , а затем pandas.DataFrame.rename, как показано ниже:

(pd.get_dummies(df, 
                columns=['Mutation']
               ).groupby(['Status']).sum().rename(columns=lambda x: x.split('_')[1]))

Выход:

        D39E  D87N  H157Y  R47H  R62H  R67H
Status                                     
AD         1     0      0     2     0     1
CO         0     1      1     0     0     0
OT         1     0      0     0     1     0

Не уверен, почему вы снова открылись... Дубликат был правильным

mozway 08.02.2023 21:08

Я искренне хочу понять, я не понял вашу точку зрения. Вы считаете, что это было неправильно закрыто? Проверьте ответ № 5 в ссылке, это именно то, что нужно.

mozway 08.02.2023 21:13

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

mozway 08.02.2023 21:15
Ответ принят как подходящий

Это должно помочь:

df.groupby(['Status', 'Mutation']).size().unstack(fill_value=0)

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