<p>“要么”的部分使事情复杂化,但仍然是可行的。在</p>
<hr/>
<p><strong>选项1</strong><br/>
既然其他用户决定把这变成一场速度竞赛,那么我的观点是:</p>
<pre><code>from collections import Counter
from itertools import chain
c = Counter(chain.from_iterable(set(x) for x in df1.values.tolist()))
df2['count'] = df2['ID'].map(Counter(c))
df2
ID count
0 jack 3
1 jill 5
2 jane 8
3 joe 9
4 ben 7
5 beatrice 6
</code></pre>
<p/>
^{pr2}$
<hr/>
<p><strong>选项2</strong><br/>
(原始答案)<code>stack</code>为基础</p>
^{3}$
<p>或者</p>
<pre><code>c = df1.stack().reset_index(level=0).drop_duplicates()[0].value_counts()
</code></pre>
<p>或者</p>
<pre><code>v = df1.stack()
c = v.groupby([v.index.get_level_values(0), v]).count().count(level=1)
# c = v.groupby([v.index.get_level_values(0), v]).nunique().count(level=1)
</code></pre>
<p>而且</p>
<pre><code>df2['count'] = df2.ID.map(c)
df2
ID count
0 jack 3
1 jill 5
2 jane 8
3 joe 9
4 ben 7
5 beatrice 6
</code></pre>
<hr/>
<p><strong>选项3</strong><br/>
^基于{<cd2>}的整形与计数</p>
<pre><code>v = pd.DataFrame({
'i' : df1.values.reshape(-1, ),
'j' : df1.index.repeat(2)
})
c = v.loc[~v.duplicated(), 'i'].value_counts()
df2['count'] = df2.ID.map(c)
df2
ID count
0 jack 3
1 jill 5
2 jane 8
3 joe 9
4 ben 7
5 beatrice 6
</code></pre>
<hr/>
<p><strong>选项4</strong><br/>
<code>concat</code>+<code>mask</code></p>
<pre><code>v = pd.concat(
[df1.ID_a, df1.ID_b.mask(df1.ID_a == df1.ID_b)], axis=0
).value_counts()
df2['count'] = df2.ID.map(v)
df2
ID count
0 jack 3
1 jill 5
2 jane 8
3 joe 9
4 ben 7
5 beatrice 6
</code></pre>