2017-02-18 16 views
2

Использование pandas, я хочу преобразовать длинный фрейм данных в широкий, но обычный метод pivot не такой гибкий, как мне нужно.Pandas long to wide

Вот длинные данные:

raw = { 
'sample':[1, 1, 1, 1, 2, 2, 3, 3, 3, 3], 
'gene':['G1', 'G2', 'G3', 'G3', 'G1', 'G2', 'G2', 'G2', 'G3', 'G3'], 
'type':['HIGH', 'HIGH', 'LOW', 'MED', 'HIGH', 'LOW', 'LOW', 'LOW', 'MED', 'LOW']} 
df = pd.DataFrame(raw)` 

который производит

gene sample type 
G1  1 HIGH 
G2  1 HIGH 
G3  1 LOW 
G3  1 MED 
G1  2 HIGH 
G2  2 LOW 
G2  3 LOW 
G2  3 LOW 
G3  3 MED 
G3  3 LOW 

То, что я хочу, это кадр данных, который имеет строки как gene и столбцы sample, но я хочу, значение ячейки заполняться «наибольшим» type согласно HIGH>MED>LOW>NONE ie оно должно выглядеть как

casted = { 
'gene':['G1', 'G2', 'G3'], 
'1':['HIGH', 'HIGH', 'MED'], 
'2':['HIGH', 'LOW', 'NONE'], 
'3':['NONE', 'LOW', 'MED'] 
} 
dfCast = pd.DataFrame(casted) 

, что делает

1  2  3  gene 
HIGH HIGH NONE G1 
HIGH LOW LOW G2 
MED NONE MED G3 

Тривиально и ошибочно, что я долго широкой команды будет выглядеть

df = df.pivot(index='gene', columns = 'sample', values='type')

, но это, конечно, не учитывает иерархии Я хочу наложить там, где HIGH>MED>LOW>NONE

При кастинге, как я могу контролировать, что такое значение ячейки?

ответ

1

Вы можете использовать pivot_table, который предоставляет метод aggfun для агрегирования дублированных значений столбца индекса; Для сортировки ключевых слов, HIGH,MED,LOW в порядке, вам необходимо, установить их в качестве ключей словаря, значение которого идет в монотонном порядке, и выбрать экстремальное значение с min/max как функция агрегации:

cat = {"HIGH": 3, "MED": 2, "LOW": 1} 
df.pivot_table("type", "gene", "sample", aggfunc=lambda x: max(x, key=cat.get)) 

enter image description here


Или другой вариант, преобразовать тип к упорядоченному категориального типа данных, а затем использовать pivot_table:

df['type'] = pd.Categorical(df['type'], ["LOW", "MED", "HIGH"], ordered=True) 
df.pivot_table("type", "gene", "sample", aggfunc='max') 

enter image description here

+0

Очень полезно и чисто. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^