<p>这对你有用吗?它不是一行,但还是短得多:)</p>
<pre><code>import pandas as pd
import numpy as np
df3 = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))
df4 = pd.DataFrame([[3, 1, np.nan, 1],
[2, 5, np.nan, 3],
[np.nan, 4, np.nan, 2],
[np.nan, 2, 1, 5]],
columns=list('ABCD'))
weights = [1,2]
average = (df3*weights[0]+df4*weights[1])/sum(weights)
average[df3.isna()] = df4
average[df4.isna()] = df3
average
</code></pre>
<p>编辑:由于指出速度是一个问题,我在下面提供了优化版本和一些性能结果。在优化版本中,我将数据帧转换为numpy阵列,因为它在那里工作得更快(在您的示例中也是如此):</p>
<pre><code>import pandas as pd
import numpy as np
df3 = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))
df4 = pd.DataFrame([[3, 1, np.nan, 1],
[2, 5, np.nan, 3],
[np.nan, 4, np.nan, 2],
[np.nan, 2, 1, 5]],
columns=list('ABCD'))
weights = np.array([1,2])
df3 = df3.values
df4 = df4.values
average = (df3*weights[0]+df4*weights[1])/np.sum(weights)
np.copyto(average,df4,where=np.isnan(df3))
np.copyto(average,df3,where=np.isnan(df4))
average
</code></pre>
<p>计时结果:</p>
<ul>
<li>你的:<code>1.18 ms ± 27.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)</code></li>
<li>我的新:<code>18.4 µs ± 1.45 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)</code></li>
<li>我的旧版本比你的差大约8.5毫秒</李>
</ul>