<p>很难说你是否有这些价值观,或是对战斗进行了硬编码。但是如果您使用<code>itertools</code>,这会容易得多。创建一个列表列表,每个子列表都是您要从中创建配对的作者的分组,然后使用链和组合将所有配对放入<code>DataFrame</code></p>
<pre><code>import pandas as pd
from itertools import combinations, chain
groups = [['f', 'g', 'h'], ['i', 'j', 'k', 'l'], ['a', 'b']]
pd.DataFrame(chain.from_iterable([combinations(x, 2) for x in groups]),
columns=['auth1', 'auth2'])
</code></pre>
<h3>输出:</h3>
<pre><code> auth1 auth2
0 f g
1 f h
2 g h
3 i j
4 i k
5 i l
6 j k
7 j l
8 k l
9 a b
</code></pre>
<hr/>
<p>如果您还需要为每个组添加一个唯一的<code>ID</code>,您可以合并一组较小的<code>DataFrames</code>:</p>
<pre><code>pd.concat([
pd.DataFrame(data, columns=['auth1', 'auth2']).assign(id=gid)
for data,gid in zip([combinations(x, 2) for x in groups], range(len(groups)))
], ignore_index=True)
auth1 auth2 id
0 f g 0
1 f h 0
2 g h 0
3 i j 1
4 i k 1
5 i l 1
6 j k 1
7 j l 1
8 k l 1
9 a b 2
</code></pre>
<p>或者,您可以将内容解压到包含3个元素列表的列表中,并调用<code>pd.DataFrame</code>一次:</p>
<pre><code>pd.DataFrame([[*z, gid] for data,gid in zip([combinations(x, 2) for x in groups], range(len(groups))) for z in data],
columns=['auth1', 'auth2', 'id'])
</code></pre>