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

时间:2018-10-10 09:40:37

标签: python python-3.x pandas dataframe

下面的问题,我得到一个像这样的DataFrame:

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"]

我认为这可行,因为多索引可以被管道引用,但是没有。

1 个答案:

答案 0 :(得分: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 1
df.loc[:, 'bar'] = 0 

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