您可以使用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
與unstack
和sort_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
解決方案與lreshape
和sort_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
,但現在它不實現。也許在一些新版熊貓中。然後我的答案將被更新。