回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>如果不求助于for循环,就无法从大于3级的数据帧中删除多级行列表</p>
<p>当显式定义索引中的所有值时,这可以很好地工作,如下所示:
<a href="https://stackoverflow.com/questions/45333949/pandas-multiindex-dataframe-remove-rows">Pandas Multiindex dataframe remove rows</a></p>
<p>例如</p>
<pre><code>mask = dfmi.index.isin(( ('A0','B0', 'C0'), ('A2','B3', 'C4') ))
dfmi.loc[~mask,:]
</code></pre>
<p>然而,当一个人想要接受所有可能的第三层次时:</p>
<pre><code>dfmi.index.isin(( ('A0','B0', slice(None)), ('A2','B3', slice(None)) ))
</code></pre>
<p>结果TypeError:unhable type:'slice'</p>
<p>目前,我正在通过以下代码实现这一点:</p>
<pre><code>import numpy as np
import pandas as pd
def mklbl(prefix, n):
return ["%s%s" % (prefix, i) for i in range(n)]
miindex = pd.MultiIndex.from_product([mklbl('A', 4),
mklbl('B', 4),
mklbl('C', 10)])
dfmi = pd.DataFrame(np.arange(len(miindex) * 2)
.reshape((len(miindex), 2)),
index=miindex).sort_index().sort_index(axis=1)
As = ['A0', 'A2']
Bs = ['B1', 'B3']
for a,b in zip(As, Bs):
dfmi_drop_idx = dfmi.loc[(a, b, slice(None)), :].index
dfmi.drop(dfmi_drop_idx, inplace=True, errors='ignore')
</code></pre>