2016-11-21 66 views
-1

我原來的問題發佈了here。我有一個數據幀如下:熊貓數據幀的轉換增加了一個空行

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 

pivot_table轉換我又收到頭之後的附加空白行中的數據框:

test_2['SEQ1'] = test_2.SEQ 
test_2 = test_2.pivot_table(index= ['ID','SEQ1']).unstack() 
test_2 = test_2.sort_index(axis=1, level=1) 
test_2.columns = ['_'.join((col[0], str(col[1]))) for col in test_2] 
test_2 

test_2

START_1 END_1 SEQ_1 START_2 END_2 SEQ_2 START_3 END_3 SEQ_3 
ID 
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 

如何刪除這些行並對齊所有標題?我試圖用test2[:2]以傳統方式刪除行,但它並未刪除空白行。

編輯:

這是更現實的數據集的精華:

ID INDEX   START     END     SEQ  NUM_PREV  NUM_ACTUAL NUM_NEXT    TIME PRE_TIME  LOC_IND 
079C 333334.0 2016-06-23 12:45:32 2016-06-23 12:51:05 1 1  23456   25456   29456   30  2    YES 
079C 333334.0 2016-06-23 12:47:05 2016-06-23 12:51:05 2 2  29456   39458   39945   20  0    NO 

回答

1

考慮轉動後復位指數/拆散操作:

from io import StringIO 
import pandas as pd 

data=''' 
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 
''' 

test_2 = pd.read_table(StringIO(data), sep="\\s+") 
seq = set(test_2['SEQ'].tolist()) 

test_2['SEQ1'] = test_2.SEQ 
test_2 = test_2.pivot_table(index= ['ID','SEQ1']).unstack() 
test_2 = test_2.sort_index(axis=1, level=1) 
test_2.columns = ['_'.join((col[0], str(col[1]))) for col in test_2] 

test_2 = test_2.reset_index() 
# ID END_1 SEQ_1 START_1 END_2 SEQ_2 START_2 END_3 SEQ_3 START_3 
# 0 1 12.0 1.0  11.0 14.0 2.0  13.0 15.0 3.0  14.0 
# 1 2 14.0 1.0  10.0 NaN NaN  NaN NaN NaN  NaN 
# 2 3 15.0 1.0  11.0 17.0 2.0  16.0 NaN NaN  NaN 

然而,正如你可以看到它的變化列排序,所以考慮使用sum()來嵌套列表理解,以適合順序:

seqmax = max(seq)+1 
colorder = ['ID'] + sum([['START_'+str(i),'END_'+str(i),'SEQ_'+str(i)] 
        for i in range(1, seqmax) if i in seq],[]) 

test_2 = test_2[colorder] 

# ID START_1 END_1 SEQ_1 START_2 END_2 SEQ_2 START_3 END_3 SEQ_3 
# 0 1  11.0 12.0 1.0  13.0 14.0 2.0  14.0 15.0 3.0 
# 1 2  10.0 14.0 1.0  NaN NaN NaN  NaN NaN NaN 
# 2 3  11.0 15.0 1.0  16.0 17.0 2.0  NaN NaN NaN 
+0

我得到'KeyError not in index'錯誤。並且應該可能有'idmax = max(test_2 ['SEQ'])+ 1' – duckertito

+0

不太確定錯誤來自哪裏。我更新了我的帖子,展示了我如何複製您的數據和數據透視代碼(完全按照您發佈的內容)。也許你的實際數據不同。 – Parfait

+0

我在我的真實數據集中只有更多列,例如'ID開始結束SEQ時間日期...'。出於某種原因,第一種方法不包括新數據框中的某些列,這就是我誤解的內容。爲什麼不包括所有列?而第二種方法可能不會假設'ID'可能是像'11A'這樣的非數字。 – duckertito