2017-04-11 103 views
1

我有一個數據幀有兩列:id1id2蟒蛇熊熊重塑數據框

df = pd.DataFrame({'id1': list('ABCBAC'), 'id2': [12,13,12,11,13,13]}) 
print(df) 

id1  id2 
A  123 
B  13 
C  12 
B  11 
A  13 
C  132 

而且我要重塑它(使用GROUPBY,或轉動也許?),以獲取以下信息:

id1  id2-1 id2-2 
A  123  13 
B  13  11 
C  12  132 

注意,恰好有兩行對每個id1但大量的不同的值id2(所以我寧願不做一個熱點向量編碼)。

有一個首選項來控制輸出可以通過字典順序進行排序,而得到這樣的:

id1  id2-1 id2-2 
A  13  123 
B  11  13 
C  12  132 

即對於每行中id2-1id2-2的值進行排序(見相應於id1 == 'B'的行)。

回答

3

計劃

  • 我們要創建每個連續的時間,我們看到了'id1'值的指數。爲此,我們將groupby('id1')然後使用cumcount()給我們這個新的指數。
  • 然後,我們設置索引是一個pd.MultiIndex與​​
  • pd.MultiIndex我們都設置爲unstack
  • 最後,我們有一些棘手的映射

d = df.set_index(['id1', df.groupby('id1').cumcount() + 1]).unstack() 
d.columns = d.columns.to_series().map('{0[0]}-{0[1]}'.format) 

print(d) 

    id2-1 id2-2 
id1    
A  12  13 
B  13  11 
C  12  13 
+2

這是一種答案,將進入筆記供將來參考:) – Vaishali

+1

@ A-ZA-Z太親切 – piRSquared

+1

@ A-ZA-Z阿門。我同意。 –

1

這應做到:

import pandas as pd 
df = pd.DataFrame({'id1': list('ABCBAC'), 'id2': [123,13,12,11,13,132]}) 
df['id2'] = df['id2'].astype(str) 
df = df.groupby(['id1']).agg(lambda x: '-'.join(x)) 
df['id2-1'] = df['id2'].apply(lambda x: x.split('-')[0]).astype(int) 
df['id2-2'] = df['id2'].apply(lambda x: x.split('-')[1]).astype(int) 
df = df.reset_index()[['id1', 'id2-1', 'id2-2']] 
+0

重命名列我有一個小問題,因爲我過分簡化了我的示例。我的'id1'中充滿了數字,因此'groupby.sum()'沒有按照計劃行事。我已經更新了我的示例。 – ysearka

+0

看到編輯:)可悲的是,它只適用於2位數字 – zipa

+0

是的,我再次編輯,我的'id2'數字並不都具有相同的數字位數(雖然,我認爲這可能會與一個簡單的應用')。 – ysearka