<p>你差点就到了。<code>groupby</code>的前两个参数很好,但最后一个需要修改。你知道吗</p>
<pre><code>f = {'Count': 'sum', 'Total' : 'mean'}
v = df.End.where(df.End.isin(['a', 'A']), 'other')
df.groupby(['Type', 'Start', v]).agg(f).reset_index()
Type Start End Total Count
0 A x a 3 1
1 A x other 3 2
2 A y A 4 2
3 A y other 4 2
4 B x A 6 1
5 B x other 6 5
6 B y a 6 3
7 B y other 6 3
</code></pre>
<hr/>
<p><strong>细节</strong></p>
<p>使用<code>where</code>/<code>mask</code>相应地改变<code>df.End</code>的值</p>
<pre><code>v = df.End.where(df.End.isin(['a', 'A']), 'other')
</code></pre>
<p>或者</p>
<pre><code>v = df.End.mask(~df.End.isin(['a', 'A']), 'other')
</code></pre>
<p/>
<pre><code>v
0 a
1 other
2 other
3 A
4 other
5 other
6 A
7 other
8 other
9 a
10 other
11 other
Name: End, dtype: object
</code></pre>
<p>或者,将列小写并比较。你知道吗</p>
<pre><code>v = df.End.where(df.End.str.lower().eq('a'), 'other')
</code></pre>
<p>其余的,正如他们所说,是历史。如果您对保持列顺序感兴趣,请在末尾使用<code>reindex</code>调用。你知道吗</p>
<pre><code>df.groupby(['Type', 'Start', v])\
.agg(f)\
.reset_index()\
.reindex(columns=df.columns.tolist())
Type Start End Count Total
0 A x a 1 3
1 A x other 2 3
2 A y A 2 4
3 A y other 2 4
4 B x A 1 6
5 B x other 5 6
6 B y a 3 6
7 B y other 3 6
</code></pre>