<p><strong>可复制数据:</strong></p>
<pre class="lang-py prettyprint-override"><code>np.random.seed(0)
df = pd.DataFrame(np.random.randint(0, 100, size=(5, 2)), columns=['a','b'])
</code></pre>
<pre><code> a b
0 44 47
1 64 67
2 67 9
3 83 21
4 36 87
</code></pre>
<hr/>
<p><strong>使用熊猫应用:</strong></p>
<p>如果确实要使用apply进行此操作,可以设置<code>axis=1</code>并使用<code>x[colname]</code>检索列名,其中<code>x</code>是当前行:</p>
<pre><code>def fn_a(x):
x['a'] = 'OK' if x['a'] < 50 else 'not OK'
if x['b'] <= 40:
x['b'] = 'too small'
elif x['b'] > 40 and x['b'] < 70:
x['b'] = 'just right'
else:
x['b'] = 'too high'
return x
df = df.apply(fn_a, axis=1)
print(df)
</code></pre>
<p>输出:</p>
<pre><code> a b
0 OK just right
1 not OK just right
2 not OK too small
3 not OK too small
4 OK too high
</code></pre>
<hr/>
<p><strong>使用矢量化方法</strong>:</p>
<P>可以考虑使用<a href="https://numpy.org/doc/stable/reference/generated/numpy.where.html" rel="nofollow noreferrer">^{<cd4>}</a>和<a href="https://numpy.org/doc/stable/reference/generated/numpy.select.html" rel="nofollow noreferrer">^{<cd5>}</a>。另外,看看<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.cut.html" rel="nofollow noreferrer">^{<cd6>}</a>。您可以设置一个函数来更新数据帧<em>就地</em>:</p>
<pre class="lang-py prettyprint-override"><code>def fn(df):
df['a'] = np.where(df.a.lt(50), 'OK', 'not OK')
df['b'] = np.select(
condlist=[df.b.le(40), df.b.gt(40) & df.b.lt(70)],
choicelist=['too small', 'just right'],
default='too high'
)
fn(df)
print(df)
</code></pre>
<p>输出:</p>
<pre><code> a b
0 OK just right
1 not OK just right
2 not OK too small
3 not OK too small
4 OK too high
</code></pre>
<p>如果不想在位置</em>中修改数据帧<em>,请在函数中进行复制,修改复制的数据帧,然后返回:</p>
<pre class="lang-py prettyprint-override"><code>def fn(df):
df = df.copy()
df['a'] = np.where(df.a.lt(50), 'OK', 'not OK')
df['b'] = np.select(
condlist=[df.b.le(40), df.b.gt(40) & df.b.lt(70)],
choicelist=['too small', 'just right'],
default='too high'
)
return df
df = fn(df)
print(df)
</code></pre>
<p>返回相同的输出</p>