熊猫:MultiIndex列的最佳方式

时间:2017-04-04 14:03:18

标签: python pandas

我从以下DataFrame开始:

df_1 = DataFrame({
        "Cat1" : ["a", "b"],
        "Vals1" : [1,2] ,
        "Vals2" : [3,4]
    })
df

enter image description here

我想让它看起来像这样:

enter image description here

我可以用这段代码来做到这一点:

df_2 = (
    pd.melt(df_1, id_vars=["Cat1"])
    .T
)
df_2.columns = (
    pd.MultiIndex
        .from_tuples(
            list(zip(df_2.loc["Cat1", :] , df_2.loc["variable", :])) ,
            names=["Cat1", None]
        )
)
df_2 = (
    df_2
    .loc[["value"], :]
    .reset_index(drop=True)
    .sortlevel(0, axis=1)
)
df_2

但是这里有太多的步骤,我觉得代码闻到了,或者至少是模糊的不是熊猫惯用的东西,好像我错过了API中的某些东西。对基于行的索引执行等效操作只需一步,例如,通过set_index()。 (请注意,我知道相当于set_index() is still an open issue的列。有没有更好,更官方的方式来做到这一点?

2 个答案:

答案 0 :(得分:11)

您可以使用stack()to_frame()T进行转置。

df_1.set_index('Cat1').stack().to_frame().T


Cat1     a           b      
     Vals1 Vals2 Vals1 Vals2
0        1     3     2     4

答案 1 :(得分:2)

将其视为转置数据框。你走了:

df.set_index('Cat1').unstack().swaplevel().sort_index().to_frame().T
Out[46]: 
Cat1     a           b      
     Vals1 Vals2 Vals1 Vals2
0        1     3     2     4