下面的问题,我得到一个像这样的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"]
我认为这可行,因为多索引可以被管道引用,但是没有。
答案 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