<p>这里有一个矢量化的方法来看待它(使用@vmg的方便的起始帧):</p>
<pre><code>>>> N = len(df.columns)
>>> keep = df.iloc[:,-N//2:].isin(["Y", "W", "1", "E"]).values
>>> df.iloc[:,:N//2] = df.iloc[:,:N//2].where(keep, 0)
>>> df
dx1 dx2 dx3 dx4 dxpoa1 dxpoa2 dxpoa3 dxpoa4
0 25041 40391 0 0 Y E NaN NaN
1 0 40391 0 0 N W U NaN
2 25041 0 42822 99681 1 N Y Y
</code></pre>
<hr/>
<p>它的作用是为最后的N//2列生成一个True和False的数组,如果值在列表中,则为True;如果值不在列表中,则为False(请注意,我假设1是字符串<code>"1"</code>,而不是整数<code>1</code>):</p>
<pre><code>>>> df.iloc[:,-N//2:]
dxpoa1 dxpoa2 dxpoa3 dxpoa4
0 Y E NaN NaN
1 N W U NaN
2 1 N Y Y
>>> df.iloc[:,-N//2:].isin(["Y", "W", "1", "E"])
dxpoa1 dxpoa2 dxpoa3 dxpoa4
0 True True False False
1 False True False False
2 True False True True
>>> df.iloc[:,-N//2:].isin(["Y", "W", "1", "E"]).values
array([[ True, True, False, False],
[False, True, False, False],
[ True, False, True, True]], dtype=bool)
</code></pre>
<p>然后我们可以使用<code>where</code>来设置<em>前</em>N//2列的值,将值保留在<code>keep</code>为真的位置,否则将其替换为0。你知道吗</p>