2017-01-23 213 views
1

缺少的條目我有一個熊貓據幀粗略看起來像這樣(與dt*是datetime對象):轉換熊貓DF從長到寬幅

 A B C D 
1 dt1 X 1 1 
2 None Y 4 1 
3 dt2 X 2 2 
4 None Y 8 2 
5 None X 3 3 
6 None Y 2 3 
7 dt3 X 7 4 
8 dt3 Y 1 4 

而且我想將其轉換爲這樣的形狀:

 A X y D 
1 dt1 1 4 1 
2 dt2 2 8 2 
3 None 3 2 3 
4 dt3 7 1 4 

這是給定的日期時間對象是相同的,或者是一個是None

我已經使用了以下嘗試:

pd.pivot_table(table, index=["D"], columns=["B"], values=["C","A"], aggfunc=lambda x: ''.join(set(x))) 

但這只是使 「A」 柱消失。

以上的其他變化也未能:

table = table.pivot(index="D", columns='B') 

這其中,例如,創建一個分層列數據框,我一直無法摺疊成所需的結構。

你能幫我嗎?

回答

1

計算pivot_table後,合併產生的DF與得到由d分組,以找到一個首次出現原始DF

piv = df.pivot_table(index=['D'], columns=['B'])['C'] 
piv.join(df.groupby('D')['A'].first()).reset_index().rename_axis([None], axis=1) 

(OR)

df.set_index(['D', 'B'])['C'].unstack(1).join(df.groupby('D')['A'].first()).reset_index() 

兩者收率:

enter image description here

+0

'PIV = df.pivot_table(指數= [ 'd'],列= [ 'B'])['C']'失敗,出現'KeyError:'C'' – TheChymera

+0

'df.pivot_table(index = ['D'],columns = ['B'],values = ['C' ])[ 'C']'?從我所知道的情況來看,這產生了具有2列級別的多索引「DF」。一個是'X'&'Y',另一個'C'。 –

+1

我用更簡潔的版本更新了我的帖子。 –

1

您可以使用:

#sort values by column A 
df = df.sort_values('A', ascending=False) 
#replace string 'None' to None if necessary 
df.A = df.A.replace({'None': None}) 
#groupby by column D and forward fill first value in each group 
df.A = df.groupby('D', sort=False)['A'].ffill() 
#reshape by set_index with unstack 
df = df.set_index(['A','D', 'B'])['C'].unstack().reset_index() 
#reorder columns, remove column name 
df = df[['A','X','Y','D']].rename_axis(None, axis=1) 
#if necessary replace NaN to None 
df.A = df.A.replace({np.nan: None}) 
#sort by column D 
df = df.sort_values('D') 
print (df) 
     A X Y D 
1 dt1 1 4 1 
2 dt2 2 8 2 
0 None 3 2 3 
3 dt3 7 1 4