2017-08-07 91 views
1

我有一個DF:大熊貓樞軸柱上,用另一個透視型欄中填入

id step step_description stepA stepA_description date 
1  1  Start    1  Beginning   8/6/2017 
1  2  Continue   2  Middle    8/7/2017 
1  3  Finish    3  End     8/7/2017 

我要轉動這個數據,所以它看起來是這樣的:

id step1 step2 step3 stepA1 stepA2 stepA3 step1_date step2_date step3_date 
1  Start Continue Finish Beginning Middle End  8/6/2017 8/7/2017 8/7/2017 

這意味着步驟列必須旋轉,然後裝滿另一個樞軸柱。有沒有辦法用熊貓來完成這個任務?我已經閱讀了樞軸選項的文檔(並且在過去使用了更多直接案例中的幾個選項),但我無法破譯一種方法來實現這一點。

我可以使用數據透視表來獲得具有我想要的結構的多級索引。有沒有辦法實質上「下降」索引,使層次結構的底部成爲df的值?

非常感謝您的光臨!

回答

2

可以使用2級的解決方案 - 使用pivotunstack

df1 = df.pivot(index='id', columns='step', values='step_description').add_prefix('step') 
print (df1) 
step step1  step2 step3 
id       
1  Start Continue Finish 

df1 = df.set_index(['id', 'step'])['step_description'].unstack().add_prefix('step') 
print (df1) 
step step1  step2 step3 
id       
1  Start Continue Finish 

但是,如果重複,需要pivot_table或聚集體groupbyapply加盟:

print (df) 
    id step step_description 
0 1  1   Start<-Same id=1, step=1 
1 1  1   Start1<-Same id=1, step=1 
2 1  2   Continue 
3 1  3   Finish 

df2=df.pivot_table(index='id', 
        columns='step', 
        values='step_description', 
        aggfunc=', '.join).add_prefix('step') 
print (df2) 
step   step1  step2 step3 
id         
1  Start, Start1 Continue Finish 

df2=df.groupby(['id', 'step'])['step_description'].apply(','.join) 
                .unstack().add_prefix('step') 
print (df2) 
step   step1  step2 step3 
id         
1  Start,Start1 Continue Finish 

編輯:

您需要2 DataFrame秒,然後concat他們:

cols = ['id','step','step_description','date'] 
df1 = df[cols].set_index(['id', 'step']).unstack().rename(columns={'step_description':'des'}) 
df1.columns = ['step{}_{}'.format(x[1], x[0]) for x in df1.columns] 
print (df1) 
    step1_des step2_des step3_des step1_date step2_date step3_date 
id                
1  Start Continue Finish 8/6/2017 8/7/2017 8/7/2017 

df2 = df.set_index(['id', 'stepA'])['stepA_description'].unstack().add_prefix('stepA') 
print (df2) 
stepA  stepA1 stepA2 stepA3 
id        
1  Beginning Middle End 

df = pd.concat([df1, df2], axis=1).reset_index() 
print (df) 
    id step1_des step2_des step3_des step1_date step2_date step3_date \ 
0 1  Start Continue Finish 8/6/2017 8/7/2017 8/7/2017 

     stepA1 stepA2 stepA3 
0 Beginning Middle End 
+0

謝謝!第一行完美工作 - 設置索引會導致'id'上的關鍵錯誤。此外,它不可能做一個多字段索引。我知道那不是我要求的! –

+0

再次感謝你。數據透視表方法也允許使用多字段索引。你認爲將另外兩列加入混合有多困難?例如,如果我添加了「step_2」和「step_description_2」,需要將另外三列添加到數據透視表中?或者單獨做每個主鍵並將dfs連接在一起會更簡單? –

+0

給我一些時間。 – jezrael

0
pivot

除了和​​方法,你也可以用groupby

df.groupby(['id', 'step'])['step_description'].sum().unstack().add_prefix('step' 
+0

謝謝你,約翰!你知道這種方法允許多字段索引的方法嗎?例如,如果還有另一個名爲'id2'的字段對所有記錄都是一樣的。 –