擅长:python、mysql、java
<p>跳到最后一部分(首先不需要为布尔掩码创建新列!)在</p>
<p>现在,为了回答你的问题。。。在</p>
<p>你的数据帧没问题!用你的方法,你只缺了一步。从<code>.levels[]</code>获取值只是第一步。在</p>
<pre><code>import pandas as pd
import numpy as np
iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']]
mult_index = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 3), index=mult_index, columns=['A', 'B', 'C'])
mult_index # same as df.index
</code></pre>
<p>这将输出:</p>
^{pr2}$
<p>从这里可以看出,返回<code>levels</code>值是不够的。您还必须将这些值映射到相应的<code>labels</code>值上。<code>labels</code>的长度将与行数相同。在</p>
<pre><code>df['index_val1'] = [ mult_index.levels[0][i] for i in mult_index.labels[0]]
</code></pre>
<p>或者</p>
<pre><code>df['index_val1'] = [ df.index.levels[0][i] for i in df.index.labels[0]]
</code></pre>
<p>不过,这个映射有一个内置函数!在</p>
<pre><code>df['index_val1'] = df.index.get_level_values(0)
</code></pre>
<p>实际上,您可以使用<code>get_level_values</code>来完成所有的布尔蒙版。<em>不需要创建额外的列</em>。在</p>
<pre><code>df[ df.index.get_level_values(0)=='bar']
</code></pre>