假设我有这样一个数据,其中包含两个玩家一个接一个地玩游戏的条目,然后在他们都赢了或输了之后,他们得到了一个共享的分数(这的逻辑并不重要,反正数字是随机的,这只是一个描述我想要的东西的例子)

所以在参与人P1和P2博弈后,每种可能的结果都会得到分数.

游戏的逻辑并不重要,我想知道的是,我是否可以用我的初始数据框创建一个新的数据框,其中包含这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

以及其他可能的独特组合.

关键是从P1和P2都赢的组合中得到30分,从P3和P4都赢的组合中得到42分,如果这4名球员都打过球并且他们都赢了,则将它们相加来创建分数.

我可以通过生成唯一的组合等来做到这一点,但在具有更大参数的实际用例中,它太长了,导致肮脏的难以阅读的代码.我想知道的是,有没有一种方法可以只使用合并、分组、联接、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

推荐答案

我希望我没弄错你的问题.从 comments 来看,我假设你在数据框中总共有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

Python相关问答推荐

Select 用a和i标签包裹的复选框?

使用FASTCGI在IIS上运行Django频道

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

如何启动下载并在不击中磁盘的情况下呈现响应?

用渐近模计算含符号的矩阵乘法

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

matplotlib图中的复杂箭头形状

python—telegraph—bot send_voice发送空文件

合并与拼接并举

基于Scipy插值法的三次样条系数

Gekko中基于时间的间隔约束

Flask运行时无法在Python中打印到控制台

如何在Python请求中组合多个适配器?

我怎么才能用拉夫分拣呢?

多索引数据帧到标准索引DF

FileNotFoundError:[WinError 2]系统找不到指定的文件:在os.listdir中查找扩展名

大Pandas 中的群体交叉融合

如何让PYTHON上的Selify连接到现有的Firefox实例-我无法连接到Marionette端口

如何将ManyToManyfield用于Self类