我有一个多指标数据帧是这样的:如何将多索引数据帧的子集存储在新的数据框中?
import pandas as pd
import numpy as np
df = pd.DataFrame({'ind1': list('aaaaaaaaabbbbbbbbb'),
'ind2': list('cccdddeeecccdddeee'),
'ind3': list(range(3))*6,
'val1': list(range(100, 118)),
'val2': list(range(70, 88))})
df_mult = df.set_index(['ind1', 'ind2', 'ind3'])
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
d 0 103 73
1 104 74
2 105 75
e 0 106 76
1 107 77
2 108 78
b c 0 109 79
1 110 80
2 111 81
d 0 112 82
1 113 83
2 114 84
e 0 115 85
1 116 86
2 117 87
我现在可以使用.loc
这样
df_subs = df_mult.loc['a', ['c', 'd'], :]
现在给人的预期
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
d 0 103 73
1 104 74
2 105 75
如果我选择它的一个子集想要再次选择df_subs
的子集,例如
df_subs.loc['a', 'c', :]
作品并给出
val1 val2
ind3
0 100 70
1 101 71
2 102 72
然而
df_subs.loc[:, 'c', :]
失败,并给出了一个错误
KeyError: 'the label [c] is not in the [columns]'
为什么会失败?
编辑
本来,我在这个职位上工作两个问题。我把它分成两部分,第二个问题可以找到here。
https://pandas.pydata.org/pandas-docs/stable/advanced.html为什么不使用'slice'或'IndexSlice' – Wen
@Wen:当然,可能会有更好的选择,但我仍然想了解上述尝试失败的原因。如果这些尝试完全错误,那么很高兴看到正确的做法,即可行的替代方案。 – Cleb
@JohnE:好的,这已经很好了。我仍然需要弄清楚什么时候我不得不使用'IndexSlice'。但似乎它没有改变问题1的任何内容:'df_mult.loc [pd.IndexSlice ['a',['c','d'],:],:]。index'仍然显示出'a'和' b'在0级;任何想法为什么? – Cleb