如何仅使用数据帧操作来获取数据帧的特定唯一组合?

问题描述 投票:0回答:1

所以想象一下,我有这样的数据,其中包含 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
python pandas dataframe data-science
1个回答
0
投票

我希望我正确理解了你的问题。根据评论,我假设数据框中共有 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
© www.soinside.com 2019 - 2024. All rights reserved.