2017-01-23 221 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