回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有这样的数据:</p>
<pre><code>df = pd.DataFrame({
'nameset1_0': [np.nan, 'A', 'B', 'C', np.nan],
'nameset1_1': ['D', np.nan, 'E', 'F', 'G'],
'nameset1_2': ['H', np.nan, np.nan, np.nan, np.nan],
'nameset2_0': ['H', 'A', 'E', 'F', np.nan],
'nameset2_1': ['D', np.nan, np.nan, 'C', 'G'],
'nameset2_2': [np.nan, np.nan, 'B', np.nan, np.nan],
'nameset2_val_0': [6, 76, 7, 34, 30],
'nameset2_val_1': [33, 97, 73, 21, 45],
'nameset2_val_2': [53, 28, 47, 94, 34]
})
</code></pre>
<p>对于<code>nameset2</code>,每个<code>_0</code>、<code>_1</code>、<code>_2</code>后缀<code>nameset2_val_</code>列中的值都对应于带有相应后缀的<code>nameset2_</code>列中的名称/标签</p>
<p>在<code>nameset1_</code>和<code>nameset2_</code>列之间的每一行中都有相同的值集,但每一行中的洗牌方式不同</p>
<p>我需要做的是为<code>nameset1</code>创建一组值列,使<code>nameset2</code>值与<code>nameset1_</code>中的适当名称正确匹配。输出应如下所示(我尽可能小心,但如果您认为此处有错误,请发表评论):</p>
<pre><code>df = pd.DataFrame({
'nameset1_0': [np.nan, 'A', 'B', 'C', np.nan],
'nameset1_1': ['D', np.nan, 'E', 'F', 'G'],
'nameset1_2': ['H', np.nan, np.nan, np.nan, np.nan],
'nameset2_0': ['H', 'A', 'E', 'F', np.nan],
'nameset2_1': ['D', np.nan, np.nan, 'C', 'G'],
'nameset2_2': [np.nan, np.nan, 'B', np.nan, np.nan],
'nameset2_val_0': [6, 76, 7, 34, np.nan],
'nameset2_val_1': [33, np.nan, np.nan, 21, 45],
'nameset2_val_2': [np.nan, np.nan, 47, np.nan, np.nan],
'nameset1_val_0': [np.nan, 76, 47, 21, np.nan],
'nameset1_val_1': [33, np.nan, 7, 34, 45],
'nameset1_val_2': [6, np.nan, np.nan, np.nan, np.nan]
})
</code></pre>
<p>我试图处理此问题的疯狂笨拙的代码目前看起来是这样的,但它的工作方式不一致或根本不起作用:</p>
<pre><code>for i in list(range(3)):
df['nameset1_val_'+str(i)] = df[
['nameset1_'+str(i)]
+['nameset2_val_'+str(j) for j in list(range(3))]
].apply(
lambda row: [i for i,e in enumerate(row[1:]) if e==row[0]],
axis=1
).apply(lambda lst: lst.pop() if len(lst)==1 else np.nan)
prefix='nameset2_val_'
df['nameset1_val_'+str(i)] = df[
['nameset2_val_'+str(i) for i in list(range(3))]
].to_numpy()[df.index,
df.columns.get_indexer(
df['nameset1_val_'+str(i)].fillna(-1).astype(int).astype(str).radd(prefix)
)]
</code></pre>