<p>对于涉及<code>CATZ</code>的第一位,可以使用<code>where</code>/<code>mask</code>+<code>get_dummies</code>-</p>
<pre><code>v = df.CATZ.where(df.CATZ.isin(['AAA', 'BBB'])).str.get_dummies()
</code></pre>
<p>或者</p>
<pre><code>v = df.CATZ.mask(~df.CATZ.isin(['AAA', 'BBB'])).str.get_dummies()
</code></pre>
<p>接下来,对于您的“复杂查询”,使用numpy广播,并在末尾进行<code>astype</code>转换-</p>
<pre><code># initial values to compare
i = np.array([['A', 'G'], ['A', 'H'], ['B', 'H']])
# perform broadcasted comparison with `i` and convert the result to OHEs
j = (df.iloc[:, :-1].values[:, None] == i).all(2).astype(int)
</code></pre>
<p/>
<pre><code># load the result into a dataframe with the appropriate column names
j = pd.DataFrame(j, columns=list(map(''.join, i)))
</code></pre>
<p>对于“复杂查询”,另一个速度较慢但内存效率更高的选项是循环遍历每个类别并查找OHE:</p>
<pre><code>ohe = []
for x, y in [['A', 'G'], ['A', 'H'], ['B', 'H']]:
# generate OHEs for each pair of elements per category
s = df.CATX.eq(x) & df.CATY.eq(y) # s = df[['CATX', 'CATY']].isin([x, y]).all(1)
s.name = ''.join([x, y])
ohe.append(s)
</code></pre>
<p/>
<pre><code># concatenate the intermediate results
j = pd.concat(ohe, 1).astype(int)
</code></pre>
<p>最后,您可以使用<code>concat</code>将<code>df</code>、<code>v</code>和<code>j</code>加载到新的数据帧中。你知道吗</p>
<pre><code>pd.concat([df, v, j], 1)
CATX CATY CATZ AAA BBB AG AH BH
0 A G AAA 1 0 1 0 0
1 B H BBB 0 1 0 0 1
2 C I AAA 1 0 0 0 0
3 B J CCC 0 0 0 0 0
4 A G BBB 0 1 1 0 0
5 B H DDD 0 0 0 0 1
6 D K EEE 0 0 0 0 0
7 E L FFF 0 0 0 0 0
</code></pre>