<p>将<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.crosstab.html" rel="nofollow noreferrer">^{<cd1>}</a>与<code>margins</code>一起使用,并按<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.html" rel="nofollow noreferrer">^{<cd3>}</a>删除最后一行:</p>
<pre><code>df1 = (pd.crosstab(df['id'], df['result'], margins=True, margins_name='total')
.iloc[:-1]
.reset_index()
.rename_axis(None, axis=1)
.rename(columns={'Not Successful':'fail','Successful':'success'}))
print (df1)
id fail success total
0 309209 0 1 1
1 309241 3 1 4
</code></pre>
<p>另一种解决方案是<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.GroupBy.size.html" rel="nofollow noreferrer">^{<cd4>}</a>和<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.unstack.html" rel="nofollow noreferrer">^{<cd5>}</a>用于重塑,而<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html" rel="nofollow noreferrer">^{<cd6>}</a>用于新列<code>total</code>:</p>
<pre><code>df1 = (df.groupby(['id','result'])
.size()
.unstack(fill_value=0)
.assign(total = lambda x: x.sum(axis=1))
.reset_index()
.rename_axis(None, axis=1)
.rename(columns={'Not Successful':'fail','Successful':'success'}))
</code></pre>