<p>您可以使用<code>df[[...]]</code>来选择所需的列,
<code>rename(columns=...)</code>更改列名,然后
<code>pd.concat</code>要堆叠子数据帧:</p>
<pre><code>import pandas as pd
df = pd.DataFrame(data={"CommonIdentifier":[1234,1235,1236,1237],
"CommonValue":["type1","type2","type1","type1"],
"Identifier1":["a","a","b","b"],
"Value1":[1,1.5,2,1.3],
"Identifier2":["b","b","c","a"],
"Value2":[4,2,3.2,1]})
colgroups = [['CommonIdentifier', 'CommonValue', 'Identifier%d'%i, 'Value%d'%i]
for i in range(1,3)]
colmap = {'{}{}'.format(col,i):'{}Joined'.format(col)
for i in range(1,3) for col in ('Identifier', 'Value')}
result = pd.concat([df[cols].rename(columns=colmap) for cols in colgroups])
print(result)
</code></pre>
<p>收益率</p>
^{pr2}$
<hr/>
<p>另一个受HYRY解决方案启发的选择是隐藏索引中的公共列,然后应用HYRY的<code>stack</code>ing技巧:</p>
<pre><code>import pandas as pd
df = pd.DataFrame(data={"CommonIdentifier":[1234,1235,1236,1237],
"CommonValue":["type1","type2","type1","type1"],
"Identifier1":["a","a","b","b"],
"Value1":[1,1.5,2,1.3],
"Identifier2":["b","b","c","a"],
"Value2":[4,2,3.2,1]})
df = df.set_index(['CommonIdentifier', 'CommonValue'])
df.columns = pd.MultiIndex.from_product([["Identifier", "Value"], range(2)])
df = df.stack()
df.index = df.index.droplevel(-1)
print(df.reset_index())
</code></pre>