<p>我建议通过广播使用<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.mask.html" rel="nofollow noreferrer">^{<cd1>}</a>和<code>numpy</code>中的链布尔掩码的非循环解决方案:</p>
<pre><code>df = pd.DataFrame({'close':[100] * 6,
'open':[4,5,4,5,np.nan,4],
'high':[np.nan,8,9,4,2,3],
'low':[1,3,5,7,np.nan,np.nan],
'change':[0,3,6,9,0,4],
'col':[np.nan]*6})
print (df)
change close col high low open
0 0 100 NaN NaN 1.0 4.0
1 3 100 NaN 8.0 3.0 5.0
2 6 100 NaN 9.0 5.0 4.0
3 9 100 NaN 4.0 7.0 5.0
4 0 100 NaN 2.0 NaN NaN
5 4 100 NaN 3.0 NaN 4.0
cols = ['open', 'high', 'low']
m = df[cols].isnull().values & (df['change'] == 0).values[:, None]
df[cols] = df[cols].mask(m, df['close'], axis=0)
#numpy alternative
#df[cols] = np.where(m, df['close'].values[:, None], df[cols])
print (df)
change close col high low open
0 0 100 NaN 100.0 1.0 4.0
1 3 100 NaN 8.0 3.0 5.0
2 6 100 NaN 9.0 5.0 4.0
3 9 100 NaN 4.0 7.0 5.0
4 0 100 NaN 2.0 100.0 100.0
5 4 100 NaN 3.0 NaN 4.0
</code></pre>
<p><strong>说明</strong>:</p>
<p>存在问题链<code>boolen DataFrame</code>,带有{<cd4>},获取错误:</p>
^{pr2}$
<p>解决方案在<a href="http://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc" rel="nofollow noreferrer">numpy broadcasting</a>:</p>
<pre><code>print (df[cols].isnull().values)
[[False True False]
[False False False]
[False False False]
[False False False]
[ True False True]
[False False True]]
print ((df['change'] == 0).values)
[ True False False False True False]
</code></pre>
<p>因此,有必要创建N x 1阵列:</p>
<pre><code>print ((df['change'] == 0).values[:, None])
[[ True]
[False]
[False]
[False]
[ True]
[False]]
m = df[cols].isnull().values & (df['change'] == 0).values[:, None]
print (m)
[[False True False]
[False False False]
[False False False]
[False False False]
[ True False True]
[False False False]]
</code></pre>