<p>正如J_H在评论中所说,文本标签本身通常很难使用。我建议首先将它们转换为<a href="https://pandas.pydata.org/pandas-docs/stable/user_guide/categorical.html" rel="nofollow noreferrer">categorical</a>,然后在聚合中选择排名最高的一个</p>
<p>为此,首先按照从最小到最大的顺序构建类别:</p>
<pre class="lang-py prettyprint-override"><code>categories = ["Worst", "Mid", "Best"]
</code></pre>
<p>然后,将所有非<code>node</code>的列转换为此分类类型:</p>
<pre class="lang-py prettyprint-override"><code>df = df.set_index("node")
df = df.apply(lambda x: pd.Categorical(x, categories=categories, ordered=True))
</code></pre>
<p>现在,如果按<code>node</code>分组,则聚合可以只取每列中的最大值:</p>
<pre class="lang-py prettyprint-override"><code>df.groupby("node").max().reset_index()
</code></pre>
<p>这将产生预期的结果:</p>
<pre><code>node touch1 touch2 touch3 touch4 touch5
A Best Best Mid Worst NaN
</code></pre>
<p>注意:如果在此之后不想将数据保持为分类数据,则需要使用<code>df = df.astype(str)</code>将其转换回</p>
<hr/>
<p><strong>数据</strong></p>
<pre><code>df = pd.DataFrame({
"node": ["A", "A"],
"touch1": ["Best", None],
"touch2": ["Mid", "Best"],
"touch3": ["Mid", "Worst"],
"touch4": [None, "Worst"],
"touch5": [None, None],
})
</code></pre>