<p>您可以使用布尔掩码来确定需要哪些列</p>
<p>首先检查值是否为3或4,如果不是,则检查值是否为2。在这两个条件之间使用<code>|</code>(or)形成复合掩码(下面的变量<code>m</code>)</p>
<p>最后,您可以<code>NaN</code>假值,这样当您进行堆栈时,<code>groupby.agg(list)</code>只剩下真值的列标签</p>
<pre><code>cols = ['acne', 'wrinkles', 'darkspot']
m1 = df1[cols].isin([3, 4])
# If no `3` or `4` on the rows, check if there is a `2`
m2 = pd.DataFrame((~m1.any(1)).to_numpy()[:, None] & df1[cols].eq(2).to_numpy(),
index=m1.index, columns=m1.columns)
m = (m1 | m2)
# acne wrinkles darkspot
#0 False False True
#1 True True False
#2 False True True
#3 False True True
# Assignment aligns on original DataFrame index, i.e. `'level_0'`
df1['problem'] = m.where(m).stack().reset_index().groupby('level_0')['level_1'].agg(list)
</code></pre>
<hr/>
<pre><code>print(df1)
Name acne wrinkles darkspot problem
0 Tom 1 1 2 [darkspot]
1 Joseph 4 3 2 [acne, wrinkles]
2 Krish 1 4 3 [wrinkles, darkspot]
3 John 2 4 4 [wrinkles, darkspot]
</code></pre>