<p>您可以使用<code>np.where()</code>,它以矢量化的方式工作,并且比<code>apply()</code>更快:</p>
<pre><code>import numpy as np
EML_LOOKUP['New_Column'] = np.where(EML_LOOKUP['Subchannel'].str.startswith("PRO"),EML_LOOKUP['ID'],np.nan)
</code></pre>
<p>在本例中,如果子通道不是以PRO开头,我们将用<code>NaN</code>填充新列,否则,我们将设置ID值</p>
<p>下面是一个完整的工作示例:</p>
<pre><code>EML_LOOKUP = pd.DataFrame({'Subchannel':['PROMO','PROMO','NOT PROMO'],
'Campaign':['FALSHSALES','PERCENTOFF','REGULAR'],
'ID':['X123','Y123','Z123']})
Subchannel Campaign ID
0 PROMO FALSHSALES X123
1 PROMO PERCENTOFF Y123
2 NOT PROMO REGULAR Z123
</code></pre>
<p>应用建议的解决方案后:</p>
<pre><code>EML_LOOKUP['New_Column'] = np.where(EML_LOOKUP['Subchannel'].str.startswith("PRO"),EML_LOOKUP['ID'],np.nan)
</code></pre>
<p>我们得到这个输出:</p>
<pre><code> Subchannel Campaign ID New_Column
0 PROMO FALSHSALES X123 X123
1 PROMO PERCENTOFF Y123 Y123
2 NOT PROMO REGULAR Z123 NaN
</code></pre>
<p>如果存在多个条件,我们可以根据我们希望使用的逻辑,使用括号分隔并由布尔运算符<code>&</code>或<code>|</code>连接的条件相加:</p>
<pre><code>EML_LOOKUP = pd.DataFrame({'Subchannel':['PROMO','PROMO','NOT PROMO'],
'Campaign':['FALSHSALES','PERCENTOFF','REGULAR'],
'ID':['X123','Y123','Z123'],
'Campaign':[10,3,20]})
EML_LOOKUP['New_Column'] = np.where((EML_LOOKUP['Subchannel'].str.startswith("PRO")) &
(EML_LOOKUP['Campaign'] > 5),
EML_LOOKUP['ID'],np.nan)
</code></pre>
<p>输出:</p>
<pre><code> Subchannel Campaign ID New_Column
0 PROMO 10 X123 X123
1 PROMO 3 Y123 NaN
2 NOT PROMO 20 Z123 NaN
</code></pre>