<h2 id="method-1-combine_first-2jzp">方法1:<code>combine_first</code></h2>
<pre><code>index_cols = ['test', 'Cond']
(
df1
.set_index(index_cols)
.combine_first(
df2.set_index(index_cols)
).reset_index()
)
</code></pre>
<p>说明:</p>
<ul>
<li><code>set_index</code>将指定的列移动到索引中,表示每一行都应该由其<code>test</code>和<code>Cond</code>列标识</李>
<li><code>foo.combine_first(bar)</code>将标识<code>foo</code>和<code>bar</code>之间匹配的索引+列标签,并在<code>foo</code>为NaN或缺少列/行的地方填充<code>bar</code>中的值。在这种情况下,由于<code>set_index</code>,两个数据帧的行将匹配,其中<code>test</code>和<code>Cond</code>是相同的,然后<code>df2</code>中的<code>UL</code>和<code>LL</code>值将填充到输出的相应列中</李>
<li><code>reset_index</code>简单地反转<code>set_index</code>调用,以便<code>test</code>和<code>Cond</code>再次成为正则列</李>
</ul>
<p>请注意,此操作可能会破坏列的顺序,因此,如果这对您很重要,那么您可以在最后调用<code>.reindex(df1.columns, axis=1)</code>,这将按<code>df1</code>中的原始顺序重新排列列</p>
<h2 id="method-2-merge-0gc7">方法2:<code>merge</code></h2>
<p>或者,您可以使用<code>merge</code>方法,该方法允许您在不使用<code>set_index</code>的情况下直接对列进行操作,但需要一些其他预处理:</p>
<pre><code>index_cols = ['test', 'Cond']
(
df1
.drop(['LL', 'UL'], axis=1)
.merge(
df2,
on=index_cols
)
)
</code></pre>
<p><code>.drop</code>调用是必需的,因为否则<code>merge</code>将在输出中包括来自两个数据帧的<code>UL</code>和<code>LL</code>列:</p>
<pre><code> test Cond day mode LL_x UL_x LL_y UL_y
0 a T1 Tue 7 NaN NaN 15.0 23.0
1 b T2 mon 7 NaN NaN -3.0 -3.5
2 c T2 sun 6 NaN NaN -19.0 -11.0
3 c T2 sat 6 NaN NaN -19.0 -11.0
4 d T3 fri 3 NaN NaN 6.5 14.5
5 d T3 wed 3 NaN NaN 6.5 14.5
</code></pre>
<h2 id="which-to-use-djd1">使用哪个</h2>
<p>对于您提供的数据,<code>merge</code>似乎是更自然的操作-如果您<em>从不</em>期望UL和LL在<code>df1</code>中有任何数据,那么如果可能的话,我建议只从输入CSV中完全删除这些列标题,这样<code>df1</code>就根本没有这些列。在这种情况下,<code>drop</code>调用将不再是必需的,并且所需的<code>merge</code>调用非常有表现力</p>
<p>但是,如果您期望<code>df1</code>有时会有<code>UL</code>或<code>LL</code>的实际值,并且希望在输出中包含这些值,那么<code>combine_first</code>解决方案就是您想要的。请注意,如果<code>df1</code>和<code>df2</code>对于特定行/列具有不同的非空值,则<code>df1.combine_first(df2)</code>将从<code>df1</code>中选择值并忽略<code>df2</code>值。如果您想对来自<code>df2</code>的值进行优先级排序,那么您想反过来调用它,即<code>df2.combine_first(df1)</code></p>