<p>这里需要注意的是-</p>
<ol>
<li>如果只使用两列,那么对4列调用<code>apply</code>是浪费</li>
<li>一般来说,调用<code>apply</code>是浪费的,因为它速度很慢,并且不会给您提供矢量化好处</li>
<li>在apply中,您处理的是标量,因此您不会像使用<code>.str</code>对象那样使用<code>pd.Series</code>访问器。<code>title.contains</code>就足够了。或者更严重的是,<code>"lip" in title</code>。</li>
<li><code>gender.isnull</code>完全错误,<code>gender</code>是标量,它没有<code>isnull</code>属性</li>
</ol>
<hr/>
<p><strong>选项1</strong><br/>
<code>np.where</code></p>
<pre><code>m = df.gender.isnull() & df.title.str.contains('lip')
df['gender'] = np.where(m, 'women', df.gender)
df
category gender sub-category title
0 health&beauty women makeup lipbalm
1 health&beauty women makeup lipstick
2 NaN women NaN lipgloss
</code></pre>
<p>不仅速度快,而且简单。如果您担心区分大小写,可以让您的<code>contains</code>检查不区分大小写-</p>
<pre><code>m = df.gender.isnull() & df.title.str.contains('lip', flags=re.IGNORECASE)
</code></pre>
<hr/>
<p><strong>选项2</strong><br/>
另一种方法是使用<code>pd.Series.mask</code>/<code>pd.Series.where</code>-</p>
<pre><code>df['gender'] = df.gender.mask(m, 'women')
</code></pre>
<p>或者</p>
<pre><code>df['gender'] = df.gender.where(~m, 'women')
</code></pre>
<p/>
<pre><code>df
category gender sub-category title
0 health&beauty women makeup lipbalm
1 health&beauty women makeup lipstick
2 NaN women NaN lipgloss
</code></pre>
<p><code>mask</code>根据提供的掩码隐式地将新值应用于列。</p>