2016-11-20 45 views
1

我有一個數據幀列如下:如何合併行,並將其轉換成

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 

我需要把它改造成這個數據幀:

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 

的問題是,行數與相同的ID是未知的apriori,這意味着最大列數START_X,END_X,SEQ_X不應該手動定義。 有沒有任何自動的方式來做這個轉換,考慮到列應該由SEQ訂購? 我應該使用group_by還是應該採用哪種方法?

回答

1

您可以使用groupbyunstack,然後sort_index和最後通過list comprehension從列中刪除MultiIndex

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

相關問題