<p>我在评论中提出了一个建议。下面是一个实现:</p>
<pre><code>import pandas as pd
from functools import reduce
data = [
(24,'Player1','D'),
(21,'Player2','D'),
(8,'Player3','B'),
(8,'Player4','B'),
(14,'Player5','C'),
(13,'Player6','C'),
(-1,'Player7','A'),
(5,'Player8','A')
]
df = pd.DataFrame(
data,
columns=['handicap', 'name', 'hcp_ABCD']
)
dfs = [
grp_df.drop(columns="hcp_ABCD")
.rename(columns={"name": f"player_{hndcp}",
"handicap": f"handicap_{hndcp}"})
for hndcp, grp_df in df.assign(key=1)
.groupby("hcp_ABCD")
]
result = reduce(
lambda left, right: left.merge(right, how="outer", on="key"),
dfs
).drop(columns="key")
print(result)
</code></pre>
<p>输出:</p>
<pre><code> handicap_A player_A handicap_B player_B handicap_C player_C handicap_D player_D
0 -1 Player7 8 Player3 14 Player5 24 Player1
1 -1 Player7 8 Player3 14 Player5 21 Player2
2 -1 Player7 8 Player3 13 Player6 24 Player1
3 -1 Player7 8 Player3 13 Player6 21 Player2
4 -1 Player7 8 Player4 14 Player5 24 Player1
5 -1 Player7 8 Player4 14 Player5 21 Player2
6 -1 Player7 8 Player4 13 Player6 24 Player1
7 -1 Player7 8 Player4 13 Player6 21 Player2
8 5 Player8 8 Player3 14 Player5 24 Player1
9 5 Player8 8 Player3 14 Player5 21 Player2
10 5 Player8 8 Player3 13 Player6 24 Player1
11 5 Player8 8 Player3 13 Player6 21 Player2
12 5 Player8 8 Player4 14 Player5 24 Player1
13 5 Player8 8 Player4 14 Player5 21 Player2
14 5 Player8 8 Player4 13 Player6 24 Player1
15 5 Player8 8 Player4 13 Player6 21 Player2
</code></pre>