擅长:python、mysql、java
<p>我不认为有一个单一的命令和许多不同的方法来实现这一点。但是,您可以在后面使用<code>melt</code>和<code>pivot</code>:</p>
<pre><code>id_vars = ["id_1", "id_2"]
melted = df.melt(id_vars=id_vars).dropna()
pivoted = melted.pivot_table(index=id_vars, columns="variable", values="value")
print(pivoted)
variable value1 value2
id_1 id_2
1 2 100.0 101.0
10 2 345.0 345.0
20 200.0 202.0
</code></pre>
<p>但是,上述解决方案比以下两种方案慢。在</p>
<p>首先,可以使用forward fill <code>ffill</code>填充nan,使用<code>last</code>获得最后一行,该行包含由于<code>ffill</code>而产生的所有有效值:</p>
^{pr2}$
<p>第二,您可以使用自定义的<code>apply</code>,而不是分组两次(因为<code>ffill</code>返回一个数据帧),它有相同的结果:</p>
<pre><code>def collapse(x):
return x.ffill().iloc[-1, 2:]
df.groupby(ids).apply(collapse).reset_index()
</code></pre>
<p>即使我们在这里使用apply,它也是最快的解决方案(至少对于您提供的虚拟数据-对于更大的数据集,它可能会有不同的缩放比例)。在</p>