Pandas dataframe - 将行索引值重新排列到列标题中

时间:2018-03-22 06:14:00

标签: python pandas dataframe

我试图从以下数据框中获取:

          DAY    Col1    ColA    ColB    ColC
    ID    
    ABC   Mon    A        123
    DEF   Mon    A        456
    GHI   Mon    A        789
    ABC   Tue    A                123
    DEF   Tue    A                456
    GHI   Tue    A                789
    ABC   Wed    A                        123
    DEF   Wed    A                        456
    GHI   Wed    A                        789

进入:

    ID    Mon    Tue    Wed
    ABC   123    123    123
    DEF   456    456    456
    GHI   789    789    789

因此,我们的想法是删除空单元格,并将列重新分类为唯一的日期,然后是该日期ID的相应值。

感谢我的任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用:

df = (df.drop('Col1', 1)
        .set_index(['ID','DAY'])
        .stack()
        .reset_index(level=2, drop=True)
        .unstack())
print (df)
DAY    Mon    Tue    Wed
ID                      
ABC  123.0  123.0  123.0
DEF  456.0  456.0  456.0
GHI  789.0  789.0  789.0

<强>解释

  1. drop
  2. 删除不必要的列Col1
  3. set_index
  4. 创建索引
  5. 重新stack,以便将NaN和列名移至MultiIndex
  6. reset_index
  7. 删除2级MultiIndex
  8. 重塑unstack
  9. 编辑:

    df = (df.drop('Col1', 1)
            .set_index('DAY', append=True)
            .stack()
            .reset_index(level=2, drop=True)
            .unstack()
            )
    print (df)
    DAY    Mon    Tue    Wed
    ID                      
    ABC  123.0  123.0  123.0
    DEF  456.0  456.0  456.0
    GHI  789.0  789.0  789.0
    

    EDIT1:添加reindex

    df = (df.drop('Col1', 1)
            .set_index('DAY', append=True)
            .stack()
            .reset_index(level=2, drop=True)
            .unstack()
            .reindex(columns=['Wed','Tue','Mon'])
            )
    print (df)
    DAY    Wed    Tue    Mon
    ID                      
    ABC  123.0  123.0  123.0
    DEF  456.0  456.0  456.0
    GHI  789.0  789.0  789.0