所以想象一下,我有这样的数据,其中包含 2 个玩家相继玩游戏的条目,然后在他们获得胜利或失败后,他们获得共享分数(这个逻辑并不重要,数字是随机的,无论如何,这只是一个描述的例子我想要什么)
因此,玩家 P1 和玩家 P2 玩完后,每种可能的结果都会获得分数。
游戏的逻辑并不重要,我想知道的是我是否可以使用我的初始数据帧创建这 4 个玩家的所有独特组合的新数据帧。因此,如果这 4 名玩家都参加比赛并一起获得分数,则计算这 4 名玩家的所有可能组合的新分数,假设将他们的总分数相加。 示例:
Player_1 Player_2 Player_3 Player_4 Outcome_1 Outcome_2 Outcome_3 Outcome_4 Score
P1 P2 P3 P4 win win win win 72
以及其他可能的独特组合。
关键是,如果这 4 名玩家都赢了,那么从 P1 和 P2 都获胜的组合中得到 30 分,从 P3 和 P4 都获胜的组合中得到 42 分,并将它们相加得出分数.
我可以通过生成独特的组合等来做到这一点,但在具有较大参数等的实际用例中,它太长并导致难以阅读的脏代码。我想知道的是,有没有一种方法可以仅使用合并、groupby、join、agg 等操作来实现这一点。
import pandas as pd
data = {
"Player_1": ["P1", "P1", "P1", "P1", "P2", "P2", "P2", "P2", "P1", "P1", "P1", "P1", "P3", "P3", "P3", "P3"],
"Player_2": ["P2", "P2", "P2", "P2", "P3", "P3", "P3", "P3", "P4", "P4", "P4", "P4", "P4", "P4", "P4", "P4"],
"Outcome_1": ["win", "win", "lose", "lose", "win", "win", "lose", "lose", "win", "win", "lose", "lose", "win", "win", "lose", "lose"],
"Outcome_2": ["win", "lose", "win", "lose", "win", "lose", "win", "lose", "win", "lose", "win", "lose", "win", "lose", "win", "lose"],
"Score": [30, 45, 12, 78, 56, 21, 67, 90, 15, 32, 68, 88, 42, 74, 8, 93]
}
df = pd.DataFrame(data)
print(df)
Player_1 Player_2 Outcome_1 Outcome_2 Score
0 P1 P2 win win 30
1 P1 P2 win lose 45
2 P1 P2 lose win 12
3 P1 P2 lose lose 78
4 P2 P3 win win 56
5 P2 P3 win lose 21
6 P2 P3 lose win 67
7 P2 P3 lose lose 90
8 P1 P4 win win 15
9 P1 P4 win lose 32
10 P1 P4 lose win 68
11 P1 P4 lose lose 88
12 P3 P4 win win 42
13 P3 P4 win lose 74
14 P3 P4 lose win 8
15 P3 P4 lose lose 93
我希望我正确理解了你的问题。根据评论,我假设数据框中共有 4 个玩家:
from itertools import product
p1, p2, p3, p4 = np.unique(df[["Player_1", "Player_2"]].values)
df = df.set_index(["Player_1", "Player_2", "Outcome_1", "Outcome_2"])
all_data = []
for p1o1, p2o2, p3o1, p4o2 in product(["win", "lose"], repeat=4):
all_data.append(
(
p1,
p2,
p3,
p4,
p1o1,
p2o2,
p3o1,
p4o2,
df.loc[(p1, p2, p1o1, p2o2), "Score"]
+ df.loc[(p3, p4, p3o1, p4o2), "Score"],
)
)
out = pd.DataFrame(
all_data,
columns=[
"Player_1",
"Player_2",
"Player_3",
"Player_4",
"Outcome_1",
"Outcome_2",
"Outcome_3",
"Outcome_4",
"Score",
],
)
打印:
Player_1 Player_2 Player_3 Player_4 Outcome_1 Outcome_2 Outcome_3 Outcome_4 Score
0 P1 P2 P3 P4 win win win win 72
1 P1 P2 P3 P4 win win win lose 104
2 P1 P2 P3 P4 win win lose win 38
3 P1 P2 P3 P4 win win lose lose 123
4 P1 P2 P3 P4 win lose win win 87
5 P1 P2 P3 P4 win lose win lose 119
6 P1 P2 P3 P4 win lose lose win 53
7 P1 P2 P3 P4 win lose lose lose 138
8 P1 P2 P3 P4 lose win win win 54
9 P1 P2 P3 P4 lose win win lose 86
10 P1 P2 P3 P4 lose win lose win 20
11 P1 P2 P3 P4 lose win lose lose 105
12 P1 P2 P3 P4 lose lose win win 120
13 P1 P2 P3 P4 lose lose win lose 152
14 P1 P2 P3 P4 lose lose lose win 86
15 P1 P2 P3 P4 lose lose lose lose 171