<p>带着理解力</p>
<pre><code>pd.DataFrame(
[(p, t, c) for (p, c), r in df.stack().items() for t in r.split()],
columns=['prod', 'testcase', 'category']
)
prod testcase category
0 TS001 001_002 activate
1 TS001 001_004 activate
2 TS001 004_005 deactivate
3 TS001 006_008 deactivate
4 TS002 003_008 activate
5 TS002 024_080 activate
6 TS002 001_008 deactivate
</code></pre>
<hr/>
<p><strong>解释</strong></p>
<pre><code>df.stack()
prod
TS001 activate 001_002\n001_004
deactivate 004_005\n006_008
TS002 activate 003_008\n024_080
deactivate 001_008
dtype: object
</code></pre>
<p>在<code>df.stack().items()</code>上迭代时,我们得到的元组的第一个元素是index value,第二个元素是value。因为我们叠加,索引值本身就是一个元组。第一对看起来像:</p>
<pre><code>(('TS001', 'activate'), '001_002\n001_004')
</code></pre>
<p>通过对<code>'001_002\n001_004'.split()</code>的后续迭代并重新排列未打包的元素,我们得到</p>
<pre><code>[(p, t, c) for (p, c), r in df.stack().items() for t in r.split()]
[('TS001', '001_002', 'activate'),
('TS001', '001_004', 'activate'),
('TS001', '004_005', 'deactivate'),
('TS001', '006_008', 'deactivate'),
('TS002', '003_008', 'activate'),
('TS002', '024_080', 'activate'),
('TS002', '001_008', 'deactivate')]
</code></pre>
<p>然后将其包装在<code>pd.DataFrame</code>构造函数中,在其中命名列。你知道吗</p>