标题可能有点令人困惑,这就是我想要做的事情:
我想转换此数据框
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
我一直试图进行数据透视表和转置,但没有运气。
答案 0 :(得分: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
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.repeat
的Numpy解决方案,并按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
,但现在它没有实现。也许在一些新版本的熊猫中。然后我的答案会更新。