<p><strong>选项1</strong><br/>
<em><code>groupby</code>与<code>size</code></em></p>
<pre><code>df.groupby(['Animal', 'Food']).size().unstack(fill_value=0).astype(bool)
Food cabbage carrots grass hay
Animal
dog False True False False
horse False False True True
rabbit True True True False
</code></pre>
<hr/>
<pre><code>s = df.groupby('Animal').Food.apply(list)
pd.DataFrame(s.values.tolist(), s.index).add_prefix('Food').fillna('')
Food0 Food1 Food2
Animal
dog carrots
horse grass hay
rabbit grass carrots cabbage
</code></pre>
<hr/>
<p><strong>选项2</strong><br/>
<em><code>groupby</code>与<code>value_counts</code></em></p>
<pre><code>df.groupby('Animal').Food.value_counts().unstack(fill_value=0).astype(bool)
Food cabbage carrots grass hay
Animal
dog False True False False
horse False False True True
rabbit True True True False
</code></pre>
<hr/>
<p><strong>选项3</strong><br/>
<em><code>groupby</code>和<code>str.get_dummies</code></em></p>
<pre><code>df.groupby('Animal').Food.apply('|'.join).str.get_dummies().astype(bool)
cabbage carrots grass hay
Animal
dog False True False False
horse False False True True
rabbit True True True False
</code></pre>
<hr/>
<p><strong>选项4</strong><br/>
<em><code>pandas.factorize</code>与<code>numpy.bincount</code></em></p>
<pre><code>f1, u1 = pd.factorize(df.Animal.values)
f2, u2 = pd.factorize(df.Food.values)
n = u1.size
m = u2.size
b = np.bincount(f1 * m + f2, minlength=n * m).reshape(n, m)
pd.DataFrame(b.astype(bool), u1, u2)
grass carrots cabbage hay
rabbit True True True False
dog False True False False
horse True False False True
</code></pre>
<p><strong>选项5</strong><br/>
<em>我很无聊。。。所以想出了更多的</em></p>
<pre><code>f, u = pd.factorize(df.Animal.values)
n = u.size
a = [[] for _ in range(n)]
[a[i].append(food) for i, food in zip(f, df.Food)];
pd.DataFrame(a, u).rename(columns=lambda x: x+1).add_prefix('Food').fillna('')
Food1 Food2 Food3
rabbit grass carrots cabbage
dog carrots
horse grass hay
</code></pre>