<p>输入数据:</p>
<pre><code>>>> df
Fruit Color Weight Tree
0 Apple Red 0.1 Tree1
1 Apple Green 0.1 Tree1
2 Apple Green 0.9 Tree2
3 Apple Yellow 0.1 Tree1
4 Pear Green 1.0 Tree2
</code></pre>
<p>用于显示结果的格式化功能:</p>
<pre><code>val2str = lambda s: ', '.join(map(lambda v: f"{v[0]}-{round(v[1], 1)}%", s.items()))
</code></pre>
<p>将数据帧转换为按树、果和;颜色:</p>
<pre><code>sr = df.set_index(["Tree", "Fruit", "Color"]).sum(axis="columns").sort_index()
</code></pre>
<pre><code>>>> sr
Tree Fruit Color
Tree1 Apple Green 0.1
Red 0.1
Yellow 0.1
Tree2 Apple Green 0.9
Pear Green 1.0
dtype: float64
</code></pre>
<p>生成一系列显示字符串:</p>
<pre><code>fruits = \
sr.sum(level=["Tree", "Fruit"]).mul(100).div(sr.sum(level="Tree")) \
.unstack(level="Fruit").apply(lambda x: val2str(x[x.notna()]), axis="columns")
colors = \
sr.sum(level=[0, "Color"]).mul(100).div(sr.sum(level="Tree")) \
.unstack(level="Color").apply(lambda x: val2str(x[x.notna()]), axis="columns")
</code></pre>
<p>将<code>fruits</code>和<code>colors</code>合并在一起:</p>
<pre><code>>>> pd.concat({"Fruits": fruits, "Colors": colors}, axis="columns")
Fruits Colors
Tree
Tree1 Apple-100.0% Green-33.3%, Red-33.3%, Yellow-33.3%
Tree2 Apple-47.4%, Pear-52.6% Green-100.0%
</code></pre>