代码之家  ›  专栏  ›  技术社区  ›  JPFrancoia

Pandas:通过组合索引和列名称来透视和展平列

  •  0
  • JPFrancoia  · 技术社区  · 6 年前

    我想在Pandas中旋转一个数据帧。我在跟踪医生: https://pandas.pydata.org/pandas-docs/stable/reshaping.html

             date variable     value
    0  2000-01-03        A  0.469112
    1  2000-01-04        A -0.282863
    2  2000-01-05        A -1.509059
    3  2000-01-03        B -1.135632
    4  2000-01-04        B  1.212112
    5  2000-01-05        B -0.173215
    6  2000-01-03        C  0.119209
    7  2000-01-04        C -1.044236
    8  2000-01-05        C -0.861849
    9  2000-01-03        D -2.104569
    10 2000-01-04        D -0.494929
    11 2000-01-05        D  1.071804
    

    跑步 df.pivot(index='date', columns='variable', values='value')

    会给我这个:

    variable           A         B         C         D
    date                                              
    2000-01-03  0.469112 -1.135632  0.119209 -2.104569
    2000-01-04 -0.282863  1.212112 -1.044236 -0.494929
    2000-01-05 -1.509059 -0.173215 -0.861849  1.071804
    

    enter image description here

    enter image description here

    我能找到的所有展平多重索引的方法最终都给了我不同行上的foo和bar。你能帮我一下吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   JPFrancoia    6 年前

    好吧,经过几个小时的紧张搜索,我找到了一个简单的解决方案:

    df.columns = [col[0] + f"_r{col[1]}" for col in df.columns]
    
        2
  •  0
  •   jezrael    6 年前

    我相信你需要 add_prefix 对于“更改列名称”,然后删除 column.name 通过 rename_axis reset_index :

    df1 = df.pivot(index='date', columns='variable', values='value')
    
    df1 = df1.add_prefix(df1.columns.name + '_').rename_axis(None, axis=1).reset_index()
    print (df1)
             date  variable_A  variable_B  variable_C  variable_D
    0  2000-01-03    0.469112   -1.135632    0.119209   -2.104569
    1  2000-01-04   -0.282863    1.212112   -1.044236   -0.494929
    2  2000-01-05   -1.509059   -0.173215   -0.861849    1.071804
    

    编辑:

    list comprehension :

    mux = pd.MultiIndex.from_product([["A", "B", "C", "D"], ["X", "Y"]])
    df = pd.DataFrame([np.arange(8)], columns=mux)
    print(df)
       A     B     C     D   
       X  Y  X  Y  X  Y  X  Y
    0  0  1  2  3  4  5  6  7
    
    df.columns = [f"{a}_r{b}" for a, b in df.columns]
    print (df)
       A_rX  A_rY  B_rX  B_rY  C_rX  C_rY  D_rX  D_rY
    0     0     1     2     3     4     5     6     7