移动“ n”行成为列

时间:2019-03-03 11:19:38

标签: python pandas

我有这个示例数据框,

      A       B       Date       C
0   83.04   82.70   01012019    0.0
1   83.04   82.71   01012019    3.0
2   83.02   82.70   02012019    0.0
3   83.02   82.69   02012019    5.0
4   82.98   82.67   03012019    2.0
5   81.28   79.61   03012019    3.0

当我使用此代码时

output = combined.assign(Period=df.groupby('Date').cumcount()).pivot(index='Period', columns='Date',values=['A','B','C'])

我收到了一个带有错误列标题的新数据框(我希望日期成为该列)

enter image description here

我如何交换第一行和第二行,以便第二行成为该列?

2 个答案:

答案 0 :(得分:2)

您有MultiIndex列,因此,如果删除最高级别,则仅返回date列即可返回数据框。

df['Period'] = df.groupby('Date').cumcount()

df_new = df.pivot_table(values=['A', 'B', 'C'], columns='Date', index='Period')
df_new.columns = [col[1] for col in df_new.columns]

    1012019 2012019 3012019 1012019 2012019 3012019 1012019 2012019 3012019
Period                                  
0   83.04   83.02   82.98   82.70   82.70   82.67   0.0     0.0     2.0
1   83.04   83.02   81.28   82.71   82.69   79.61   3.0     5.0     3.0

编辑

要简单地交换级别,可以使用.swaplevel()

df_new = df.pivot_table(values=['A', 'B', 'C'], columns='Date', index='Period')

df_new.columns = df_new.columns.swaplevel()

#Output

Date     1012019    2012019 3012019 1012019 2012019 3012019 1012019 2012019 3012019
         A          A       A       B       B       B       C       C       C
Period                                  
0        83.04      83.02   82.98   82.70   82.70   82.67   0.0     0.0     2.0
1        83.04      83.02   81.28   82.71   82.69   79.61   3.0     5.0     3.0

答案 1 :(得分:0)

另一种解决方案:

df['Period'] = df.groupby('Date').cumcount()
df.set_index(['Period', 'Date']).unstack()