<p>因为问题已经改变了,我发布了一个新的答案</p>
<p>首先,我稍微简化了您的数据帧:</p>
<pre class="lang-py prettyprint-override"><code>import pandas as pd
df = pd.DataFrame([['Bad', 'Male', 1542],
['Good', 'Male', 1419],
['Good', 'Female', 714],
['Bad', 'Female', 419],
['Neutral', 'Male', 254],
['Neutral', 'Female', 138],
['Bad', 'Genderless', 9],
['Good', 'Genderless', 4],
['Neutral', 'Genderless', 3],
['Reformed', 'Male', 2]])
df.columns = ['ALIGN', 'SEX', 'n']
</code></pre>
<p>对于外圈中的数字,我们可以使用一个简单的<code>groupby</code>,正如您所做的:</p>
<pre class="lang-py prettyprint-override"><code>outer = df.groupby('SEX').sum()
</code></pre>
<p>但对于内环中的数字,我们需要根据两个分类变量进行分组,这将产生一个多索引:</p>
<pre class="lang-py prettyprint-override"><code>inner = df.groupby(['SEX', 'ALIGN']).sum()
inner
</code></pre>
<pre><code> n
SEX ALIGN
Female Bad 419
Good 714
Neutral 138
Genderless Bad 9
Good 4
Neutral 3
Male Bad 1542
Good 1419
Neutral 254
Reformed 2
</code></pre>
<p>我们可以使用<code>get_level_values()</code>方法从多索引中提取适当的标签:</p>
<pre class="lang-py prettyprint-override"><code>inner_labels = inner.index.get_level_values(1)
</code></pre>
<p>现在,您可以将上述值转换为一维数组,并将其插入到绘图调用中:</p>
<pre class="lang-py prettyprint-override"><code>import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(24,12))
size = 0.3
ax.pie(outer.values.flatten(), radius=1,
labels=outer.index,
autopct='%1.1f%%',
wedgeprops=dict(width=size, edgecolor='w'))
ax.pie(inner.values.flatten(), radius=1-size,
labels = inner_labels,
wedgeprops=dict(width=size, edgecolor='w'))
ax.set(aspect="equal", title='Pie plot with `ax.pie`')
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/yKCvb.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/yKCvb.png" alt="nested pie chart"/></a></p>