2016-06-28 79 views
2

我有一個重複的行,我想連接它們。他們是這樣的:如何使用self join來重塑Pandas中的重複行?

ID Col1 Col2 Col3 ... Col46 
----------------------------------- 
id1 a1  b1  c1 ... x1 
id2 a2  b2  c2 ... x2 
id1 a1  b1  c1 ... y1 
id3 a3  b3  c3 ... x3 
id3 a3  b3  c3 ... y3 
id3 a3  b3  c3 ... z3 

什麼,我想要做的是:

ID Col1 Col2 Col3 ... Col46 Col47 Col48 
---------------------------------------------------- 
id1 a1  b1  c1 ... x1  y1  None 
id2 a2  b2  c2 ... d2  None  None 
id3 a3  b3  c3 ... x3  y3  z3 

對於這一點,我使用的合併:

data_cliq = self.cliq.copy() 
    self.cliq = pd.merge(self.cliq, data_cliq, on = 'ID', how = 'inner') 

,但我想我需要更復雜的東西因爲它不會給我我想要的結果。

+0

也許看看關於'pivot'功能。 – ysearka

回答

4

我想你需要先通過cumcount創建groups然後用pivot_table

df['g'] = df.groupby('ID')['Col46'].cumcount() 

df = df.pivot_table(index=['ID','Col1','Col2','Col3'], 
        columns='g', 
        values='Col46', 
        aggfunc=''.join).reset_index() 

print (df) 

g ID Col1 Col2 Col3 0  1  2 
0 id1 a1 b1 c1 x1 y1 None 
1 id2 a2 b2 c2 x2 None None 
2 id3 a3 b3 c3 x3 y3 z3 

如果需要重命名列名:

df['g'] = 'Col' + (df.groupby('ID')['Col46'].cumcount() + 46).astype(str) 

df = df.pivot_table(index=['ID','Col1','Col2','Col3'], 
        columns='g', 
        values='Col46', 
        aggfunc=''.join).reset_index() 

print (df) 
g ID Col1 Col2 Col3 Col46 Col47 Col48 
0 id1 a1 b1 c1 x1 y1 None 
1 id2 a2 b2 c2 x2 None None 
2 id3 a3 b3 c3 x3 y3 z3 
+0

它很棒!非常感謝你 –

+0

謝謝你的接受!祝你好運,美好的一天! – jezrael