<p>您可以执行以下操作:</p>
<p><strong>步骤1</strong>:设置<code>transform</code>功能:</p>
<pre><code>def coupling(ser):
keys = ser.index
values = ser.values
couples = [None] * len(ser)
free = {*range(len(ser))}
while free:
i = min(free)
j = i + 1
while j < len(ser):
if (values[j] == -values[i]
and j in free):
couples[i], couples[j] = keys[j], keys[i]
free.remove(j)
break
j += 1
free.remove(i)
return couples
</code></pre>
<p><strong>步骤2</strong>:应用于组:</p>
<pre><code>df_out = df_in.set_index('key')
group = ['category', 'type', 'source']
df_out['coupling_key'] = (df_out[group + ['amount']]
.groupby(group)
.transform(coupling))
df_out.reset_index(drop=False, inplace=True)
</code></pre>
<p>结果:</p>
<pre><code> key date category type source amount coupling_key
0 80000001 20200901 Z293 tools Q112 -123.21 80000003
1 80000002 20200901 B993 supplies E443 3.12 80000004
2 80000003 20200902 Z293 tools Q112 123.21 80000001
3 80000004 20200902 B993 supplies E443 -3.12 80000002
4 80000005 20200902 W884 repairs P443 9312.00 None
5 80000006 20200903 C123 custom B334 312.23 80000008
6 80000007 20200904 V332 misc E449 -13.23 80000009
7 80000008 20200905 C123 custom B334 -312.23 80000006
8 80000009 20200905 V332 misc E449 13.23 80000007
9 80000010 20200906 Z213 technology QQ32 10.00 80000012
10 80000011 20200906 Z213 technology QQ32 10.00 80000013
11 80000012 20200906 Z213 technology QQ32 -10.00 80000010
12 80000013 20200906 Z213 technology QQ32 -10.00 80000011
13 80000014 20200906 Z213 technology QQ32 10.00 80000015
14 80000015 20200906 Z213 technology QQ32 -10.00 80000014
</code></pre>
<p>(我假设<code>date</code>列的顺序与示例中相同。)</p>