通过转置两列并重复另一列来重塑pandas DataFrame

时间:2016-12-03 19:27:20

标签: python pandas

标题可能有点令人困惑,这就是我想要做的事情:

我想转换此数据框

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

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

1 个答案:

答案 0 :(得分:3)

您可以使用melt,在dropsort_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.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,但现在它没有实现。也许在一些新版本的熊猫中。然后我的答案会更新。