<p>实际上,您的任务不是换位,而是类似于<em>堆栈</em>,
限制为非零值,并添加一些内容,即行
包含您希望输出包含的所有零(从<em>C1</em>到<em>C4</em>)
<em>word1</em>到<em>word3</em>的值,以及:</p>
<ul>
<li><em>变量=='C1'</em></li>
<li><em>值==0</em></李>
</ul>
<p>为此,计算2个中间变量:</p>
<ol>
<li><p>包含<em>C1</em>到<em>C4</em>列堆栈的<em>系列</em>,带有
<em>word1</em>到<em>word3</em>移动到索引和索引的最后一级
重命名为<em>变量</em>:</p>
<pre><code>s = df.set_index(['word1', 'word2', 'word3']).stack().rename('value')
s.index.rename('variable', level=3, inplace=True)
</code></pre>
<p>对于您的输入数据,结果是:</p>
<pre><code>word1 word2 word3 variable
word11 word12 word13 C1 0
C2 0
C3 0
C4 0
word21 word22 word23 C1 0
C2 1
C3 1
C4 0
word31 word32 word33 C1 1
C2 0
C3 0
C4 1
Name: value, dtype: int64
</code></pre></li>
<li><p>包含所有零的行的输出结果(从<em>C1</em>到<em>C4</em>):</p>
<pre><code>dfZer = df[df.loc[:, 'C1':'C4'].sum(axis=1) == 0].loc[:, 'word1':'word3']\
.assign(variable='C1', value=0)
</code></pre>
<p>对于您的数据,结果是:</p>
<pre><code> word1 word2 word3 variable value
0 word11 word12 word13 C1 0
</code></pre></li>
</ol>
<p>然后生成最终结果,如下所示:</p>
<pre><code>pd.concat([s[s > 0].reset_index(), dfZer], sort=False, ignore_index=True)
</code></pre>
<p>请注意:</p>
<ul>
<li><code>s[s > 0]</code>删除值为<em>0</em>的元素</li>
<li><code>reset_index()</code>将其转换回数据帧</li>
<li><code>dfZer</code>提供“全零”输入行的结果</li>
<li><code>ignore_index=True</code>“重新生成”结果中的索引</李>
</ul>
<p>要跟踪此解决方案的工作方式,请同时打印<code>s[s > 0].reset_index()</code>
一切都应该清楚</p>