2016-11-21 7 views
-1

私の元の質問hereが掲載されました。次のように私は、データフレームを持っている:パンダの変換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 

私はこのデータフレームに変換したいと思った:

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 

Iは、ヘッダの後に追加の空白行を有するデータフレームを受信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 

2試験2

これらの行を削除してすべてのヘッダーを整列させるにはどうすればよいですか?私はtest2[:2]を使用して従来の方法で行を削除しようとしましたが、ブランク行は削除されませんでした。

EDIT:

これは、より現実的なデータセットの抜粋です:

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 START END SEQ TIME DATE ...'。何らかの理由で最初のメソッドに新しいデータフレームの列の一部が含まれていないということは、私が誤解していることです。なぜすべての列が含まれていないのですか? 2番目の方法はおそらく 'ID'が' 11A'のように非数値であるとは想定していません。 – duckertito

関連する問題