簡體   English   中英

Pandas:創建具有兩個非重復匹配的數據框

[英]Pandas: Creating data frames with non-repeating matches of two

假設以下簡單 dataframe:

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)並使用 css 來創建以前匹配的唯一 ID(哈希?)?

最好的解決方案是什么?

注意:可能會在賽季期間將新條目添加到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)

另一方面,如果游戲中玩家的順序無關緊要(即 John 應該只和 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)

假設以下簡單的 dataframe:

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)和使用 css 來創建以前匹配的唯一 ID(哈希?)可能是它嗎?

最好的解決方案是什么?

注意:在賽季期間可能會在df中添加新條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM