<p>另一种选择:</p>
<pre><code># Create Mapper For nameset2 Keys and Values
m = df.filter(like='nameset2')
m.columns = m.columns \
.str.replace(r'val_(\d+)$', r'\1_val', regex=True) \
.str.replace(r'_(\d+)$', r'_\1_key', regex=True) \
.str.split('_', expand=True).droplevel(0)
m = m.stack(level=0).dropna() \
.droplevel(1).reset_index() \
.set_index(['index', 'key'])
# Join with nameset1 values and pivot to wide format
vals = df.filter(like='nameset1') \
.stack() \
.reset_index() \
.join(m, on=['level_0', 0]) \
.pivot(columns='level_1', index='level_0') \
.rename_axis(None)
# Fix Column Names
vals.columns = vals.columns.map(
lambda s: '{}_val_{}'.format(*s[1].split('_'))
if s[0] == 'val' else
s[1]
)
# Join vals with nameset2
new_df = vals.join(df.filter(like='nameset2'))
print(new_df.to_string())
</code></pre>
<hr/>
<ol>
<li>创建关联索引键值对的映射程序<code>m</code>:</li>
</ol>
<pre><code> val
index key
0 H 6
D 33
1 A 76
2 E 7
B 47
3 F 34
C 21
4 G 45
</code></pre>
<ol start=“2”>
<li>将此映射器与nameset1连接,以获取值并转换为宽格式:</li>
</ol>
<pre><code> 0 val
level_1 nameset1_0 nameset1_1 nameset1_2 nameset1_0 nameset1_1 nameset1_2
0 NaN D H NaN 33.0 6.0
1 A NaN NaN 76.0 NaN NaN
2 B E NaN 47.0 7.0 NaN
3 C F NaN 21.0 34.0 NaN
4 NaN G NaN NaN 45.0 NaN
</code></pre>
<ol start=“3”>
<li>清理多索引列:</li>
</ol>
<pre><code>nameset1_0 nameset1_1 nameset1_2 nameset1_val_0 nameset1_val_1 nameset1_val_2
</code></pre>
<ol start=“4”>
<li>使用名称集_2值联接:</li>
</ol>
<pre><code> nameset1_0 nameset1_1 nameset1_2 nameset1_val_0 nameset1_val_1 nameset1_val_2 nameset2_0 nameset2_1 nameset2_2 nameset2_val_0 nameset2_val_1 nameset2_val_2
0 NaN D H NaN 33.0 6.0 H D NaN 6 33 53
1 A NaN NaN 76.0 NaN NaN A NaN NaN 76 97 28
2 B E NaN 47.0 7.0 NaN E NaN B 7 73 47
3 C F NaN 21.0 34.0 NaN F C NaN 34 21 94
4 NaN G NaN NaN 45.0 NaN NaN G NaN 30 45 34
</code></pre>