将多索引列附加到空数据框中

以下问题我得到了一个像这样的数据帧:


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

我想说 foo 到一个新的 DataFrame 完全空构造如下:


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 引用,但它没有。


catspeake
浏览 163回答 1
1回答

收到一只叮咚

尝试使用以下方法df.xs从 multiIndex 中进行选择并保持水平:r_df = df.xs('foo', axis=1, level=0, drop_level=False)如果你想在下面追加一个新列,foo你可以这样做:df.loc[:,('foo','m')] = 0如果您想在level=0(与 相同级别foo)追加一个新列# with no col in level 1df.loc[:, 'bar'] = 0 # with col in level 0 and 1df.loc[:,('bar','m')] = 0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python