2016-12-03 94 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,但現在它不實現。也許在一些新版熊貓中。然後我的答案將被更新。