擅长:python、mysql、java
<p>显然,使用<code>.loc</code>可能会使索引保持其原始形式,直到它们被重置。使用<code>.copy()</code>来避免原始数据帧的任何视图仍然保持multindex值。在</p>
<pre><code>df_subs = df_mult.loc['a', ['c', 'd'], :].copy()
print(df_subs.index)
# MultiIndex(levels=[['a', 'b'], ['c', 'd', 'e'], [0, 1, 2]],
# labels=[[0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
# names=['ind1', 'ind2', 'ind3'])
</code></pre>
<p>此外,按值过滤仍保留multindex值:</p>
^{pr2}$
<p>所以,可以考虑在初始分配之后手动重置索引</p>
<pre><code>df_subs = df_mult.loc['a', ['c', 'd'], :].reset_index()
df_subs = df_subs.set_index(['ind1', 'ind2', 'ind3'])
print(df_subs.index)
# MultiIndex(levels=[['a'], ['c', 'd'], [0, 1, 2]],
# labels=[[0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
# names=['ind1', 'ind2', 'ind3'])
</code></pre>
<p>最后,对于最后一个<code>.loc</code>赋值(#2),根据需要至少提供第一个索引:</p>
<pre><code>df_subs2 = df_subs.loc['a', 'c', :]
# val1 val2
# ind3
# 0 100 70
# 1 101 71
# 2 102 72
</code></pre>