2016-12-03 98 views
1

标题可能有点混乱,这就是我想做的事:通过转两列重复重塑熊猫数据帧另一个

我想这个数据帧

pd.DataFrame({'name':['A','B','C'],'date1':[1999,2000,2001],'date2':[2011,2012,2013]}) 

    date1 date2 name 
0 1999 2011 A 
1 2000 2012 B 
2 2001 2013 C 

转换成如下:

dates name 
0 1999 A 
1 2011 A 
2 2000 B 
3 2012 B 
4 2001 C 
5 2013 C 

我一直在试图做数据透视表和转置,但没有运气。

回答

3

您可以使用melt,通过drop和最后sort_values删除列:

print (pd.melt(df, id_vars='name', value_name='dates') 
     .drop('variable', axis=1) 
     .sort_values('name')[['dates','name']]) 
    dates name 
0 1999 A 
3 2011 A 
1 2000 B 
4 2012 B 
2 2001 C 
5 2013 C 

unstacksort_index另一种解决方案:

print (df.set_index('name') 
     .unstack() 
     .reset_index(drop=True, level=0) 
     .sort_index() 
     .reset_index(name='dates')[['dates','name']]) 

    dates name 
0 1999 A 
1 2011 A 
2 2000 B 
3 2012 B 
4 2001 C 
5 2013 C 

解决方案与lreshapesort_values

print (pd.lreshape(df, {'dates':['date1', 'date2']}).sort_values('name')[['dates','name']]) 
    dates name 
0 1999 A 
3 2011 A 
1 2000 B 
4 2012 B 
2 2001 C 
5 2013 C 

numpy的溶液与numpy.repeat和压扁通过numpy.ravel

df2 = pd.DataFrame({ 
     "name": np.repeat(df.name, 2), 
     "dates": df[['date1','date2']].values.ravel()}) 
print (df2) 
    dates name 
0 1999 A 
0 2011 A 
1 2000 B 
1 2012 B 
2 2001 C 
2 2013 C 

编辑:

lreshape现在是未记录的,但有可能在未来将被移除(with pd.wide_to_long too)。

可能的解决方案是将所有3个功能合并到一个 - 也许melt,但现在它不实现。也许在一些新版熊猫中。然后我的答案将被更新。