<p>1)一种方法是对<code>"A"</code>进行分组,并使用<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.value_counts.html" rel="nofollow noreferrer">^{<cd3>}</a>计算<code>"B"</code>下元素的不同计数。然后将<code>unstack</code>和{<cd5>}与{<cd6>}融合,得到所需的{<cd7>}:</p>
<pre><code>df.groupby('A')['B'].value_counts().unstack().stack(dropna=False).reset_index(name="Count")
</code></pre>
<p>2)<a href="http://pandas.pydata.org/pandas-docs/version/0.18.1/generated/pandas.crosstab.html" rel="nofollow noreferrer">^{<cd8>}</a>也提供了一个很好的替代方案,如果我们在堆叠后用<code>np.NaN</code>替换零计数元素:</p>
^{pr2}$
<p>两种方法都会产生:</p>
<p><a href="https://i.stack.imgur.com/kMrLr.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/kMrLr.png" alt="enter image description here"/></a></p>
<hr/>
<p><strong><em>编辑1:</em></strong></p>
<p>要使分组键,<code>"A"</code>以某种格式显示(即保留第一个出现的项,同时用空字符串替换其余项)</p>
<pre><code>df_g = pd.crosstab(df['A'], df['B']).stack().replace({0:np.nan}).reset_index(name="Count")
df_g.loc[df_g.duplicated('A'), "A"] = ""
</code></pre>
<p><a href="https://i.stack.imgur.com/DXL1t.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/DXL1t.png" alt="enter image description here"/></a></p>
<p><strong><em>编辑2:</em></strong></p>
<p>如果您希望<code>"A"</code>作为多索引<code>DF</code>的一部分的单个健康单元格:</p>
<pre><code>df.groupby('A')['B'].value_counts().unstack().stack(dropna=False
).reset_index(name="Count").set_index(['A', 'B'])
</code></pre>
<p><a href="https://i.stack.imgur.com/4Qd4N.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/4Qd4N.png" alt="enter image description here"/></a></p>