您可以使用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
,但现在它不实现。也许在一些新版熊猫中。然后我的答案将被更新。