Pandas:创建具有两个

问题描述

假设以下简单的数据框:

df = pd.DataFrame({'name': ['John','Max','Ethan','Karen','Carl','Jenny']})

为了在夏天匹配网球伙伴,我需要创建一个或多个数据框,其中每两个匹配的创建方式如下:

John  Max
Max   John
Ethan Caren
Caren Ethan
Carl  Jenny
Jenny Carl
...

我们这样做是为了每个月通知每一方他或她的对手。匹配可以是随机的,它不必遵循给定的顺序。但是,有一个重要的标准:匹配不允许重复,它们只能发生一次。我意识到 np.roll 不是最好的,因为添加新条目时匹配会重复。我想在 itertools.combinations(df,2) 旁边的一些东西,并使用一个创建以前匹配的唯一 id(哈希?)的 css 可能是它吗?

最好的解决方案是什么?

注意:可能会在赛季期间向 df 添加新条目。

解决方法

假设游戏中玩家的顺序很重要(即游戏 John vs Max 不同于 Max vs John - 如您提供的示例),这是一种方法:

df["temp"] = 1
matches = pd.merge(df,df,on="temp").drop("temp",axis=1)
matches.columns = ["player_1","player_2"]
matches = matches.query("player_1 != player_2").reset_index(drop=True)

另一方面,如果游戏中的玩家顺序无关紧要(即约翰应该只和 Max 玩一次),那么这应该可行:

df_lst = []
for i in range(len(df) - 1):
    temp = df.iloc[i+1:].assign(player_2=df.iloc[i,0])
    df_lst.append(temp)

matches = pd.concat(df_lst).reset_index(drop=True)
matches.rename({"name": "player_1"},axis=1,inplace=True)