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

将多索引列追加到空数据帧中

  •  0
  • PapaTim68  · 技术社区  · 7 年前

    df = pd.DataFrame(columns=pd.MultiIndex(levels=[["foo","baa"],["x","y","z"]], labels=[[0,0,0,1,1,1],[0,1,2,0,1,2]]), index=[0,1,2,3], data=np.random.rand(4,6))
    
             foo                           baa                    
              x         y         z         x         y         z
    0  0.263780  0.942880  0.176744  0.914854  0.920735  0.573692
    1  0.601317  0.584691  0.288536  0.832064  0.095142  0.186045
    2  0.807323  0.075620  0.399703  0.936894  0.168441  0.468984
    3  0.871293  0.324817  0.395784  0.133541  0.365586  0.615219
    

    r_df = pd.DataFrame(index=df.index)
    Empty DataFrame
    Columns: []
    Index: [0, 1, 2, 3]
    

             foo
              x         y         z
    0  0.263780  0.942880  0.176744
    1  0.601317  0.584691  0.288536
    2  0.807323  0.075620  0.399703
    3  0.871293  0.324817  0.395784
    

    我试着这样做:

    for label in df.columns.levels[0]:
        data = df[label]
        for row in data.index:
            r_df.loc[row,(label,"x")] = data["x"]
            r_df.loc[row,(label,"y")] = data["y"]
            r_df.loc[row,(label,"z")] = data["z"]
    

    我认为这可以工作,因为多索引可以被tubles引用,但事实并非如此。

    1 回复  |  直到 7 年前
        1
  •  1
  •   gyx-hh    7 年前

    使用以下命令尝试 df.xs 要从多索引中选择并保持级别:

    r_df = df.xs('foo', axis=1, level=0, drop_level=False)
    

    如果要在下面附加新列 foo 然后你可以做:

    df.loc[:,('foo','m')] = 0
    

    level=0 (与相同级别) )

    # with no col in level 1
    df.loc[:, 'bar'] = 0 
    
    # with col in level 0 and 1
    df.loc[:,('bar','m')] = 0