У меня есть этот фрейм данных:
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
Где мутации — это имена столбцов, а их значения — количество попаданий — соответствуют статусу.
Это звучит как crosstab
вопрос.
А как насчет df2 = df.pivot_table(index='Status', columns='Mutation', aggfunc='size', fill_value=0) df2 = df2.reset_index().rename_axis(None, axis=1)
?
Однозначно crosstab
+ reset_index
Мы можем использовать 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
Не уверен, почему вы снова открылись... Дубликат был правильным
Я искренне хочу понять, я не понял вашу точку зрения. Вы считаете, что это было неправильно закрыто? Проверьте ответ № 5 в ссылке, это именно то, что нужно.
Хорошо, это ваше право, мне очень жаль, что вы так себя чувствуете. Никакого вреда с моей стороны.
Это должно помочь:
df.groupby(['Status', 'Mutation']).size().unstack(fill_value=0)
Мне кажется, это перекрестная таблица.
pd.crosstab
документы: pandas.pydata.org/docs/reference/api/pandas.crosstab.html См. также сообщение SO о повороте, часть 9: stackoverflow.com/questions/47152691/…