2016-11-20 2 views
1

у меня есть dataframe следующим образом:Как объединить строки и преобразовать их в столбцы

ID START END SEQ 
1 11  12 1 
1 14  15 3 
1 13  14 2 
2 10  14 1 
3 11  15 1 
3 16  17 2 

мне нужно, чтобы превратить его в этот DataFrame:

ID START_1 END_1 SEQ_1 START_2 END_2 SEQ_2 START_3 END_3 SEQ_3 
1 11  12  1  13  14  2  14  15  3 
2 10  14  1  NA  NA  NA NA  NA  NA 
3 11  15  1  16  17  2  NA  NA  NA 

Проблема в том, что число строк с тем же идентификатором неизвестен apriori, что означает, что максимальное количество столбцов START_X, END_X, SEQ_X не должно определяться вручную. Есть ли какой-либо автоматизированный способ сделать это преобразование, учитывая, что столбцы должны быть упорядочены по SEQ? Должен ли я использовать group_by или каким должен быть подход?

ответ

1

Вы можете использовать groupby с unstack, затем sort_index и последний удалить MultiIndex из колонок list comprehension:

df['SEQ1'] = df.SEQ 
df = df.groupby(['ID','SEQ1']).mean().unstack() 
df = df.sort_index(axis=1, level=1) 
df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns] 
print (df) 
    START_1 END_1 SEQ_1 START_2 END_2 SEQ_2 START_3 END_3 SEQ_3 
ID                  
1  11.0 12.0 1.0  13.0 14.0 2.0  14.0 15.0 3.0 
2  10.0 14.0 1.0  NaN NaN NaN  NaN NaN NaN 
3  11.0 15.0 1.0  16.0 17.0 2.0  NaN NaN NaN 

Другое решение с pivot_table, aggfunc='mean' по умолчанию:

df['SEQ1'] = df.SEQ 
df = df.pivot_table(index= ['ID','SEQ1']).unstack() 
df = df.sort_index(axis=1, level=1) 
df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns] 
print (df) 
    END_1 SEQ_1 START_1 END_2 SEQ_2 START_2 END_3 SEQ_3 START_3 
ID                  
1 12.0 1.0  11.0 14.0 2.0  13.0 15.0 3.0  14.0 
2 14.0 1.0  10.0 NaN NaN  NaN NaN NaN  NaN 
3 15.0 1.0  11.0 17.0 2.0  16.0 NaN NaN  NaN 
+0

Один вопрос, @jezrael , Этот код генерирует дополнительную строку чуть ниже заголовка и помещает 'ID' в эту строку, в то время как другие заголовки находятся в первой строке. Можно ли это решить? На самом деле я открыл новый поток, просто если вы хотите помочь (http://stackoverflow.com/questions/40723561/transformation-of-dataframe) – duckertito

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