重构 Gamble 数据库以进行比较

Restructuring a Gamble database for comparison

提问人:DataDude 提问时间:9/6/2023 更新时间:9/7/2023 访问量:28

问:

对于一个副业项目,我正在考虑比较 2 家博彩机构的赔率,并且很难将这些信息以正确的格式放入我的表格中。

目前我有下表:

供应商 投注类型 结果标签 赔率
机构 A 一个 高于 1.5 1.3
机构 A 一个 低于 1.5 1.6
机构 A B 是的 2.3
机构 A B 1.2
机构 B 一个 高于 1.5 1.1
机构 B 一个 低于 1.5 1.8
机构 B B 是的 1.5
机构 B B 1.3

我想要的是以行如下所示的方式转换此表:

供应商 投注类型 结果标签 赔率 OppositeProvider OppositeOutcomeLabel(相反结果标签) 相反的赔率
机构 A 一个 高于 1.5 1.3 机构 B 低于 1.5 1.8
机构 A 一个 低于 1.5 1.6 机构 B 高于 1.5 1.1
机构 A B 是的 2.3 机构 B 1.3
机构 A B 1.2 机构 B 是的 1.5

此转换将剪切一半的行,并将其粘贴为列。重要的是要注意,这里的 OppositeOutcomeLabel 是 OutcomeLabel 的反面(命名会泄露它,但我想我会突出显示它)。

我做了一些准备工作,但似乎无法弄清楚最后一步。任何帮助都会很棒!

以下示例只是数据的一个子集。我正在寻找一种可向未来扩展的动态解决方案(除了指定相反方向)

提前致谢

data = {
    'Provider': ['Agency A', 'Agency A', 'Agency A', 'Agency A', 'Agency B', 'Agency B', 'Agency B', 'Agency B'],
    'MainBet': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B'],
    'OutcomeLabel': ['Higher than 1.5', 'Lower than 1.5', 'Yes', 'No', 'Higher than 1.5', 'Lower than 1.5', 'Yes', 'No'],
    'Odds': [2.0, 3.0, 1.5, 2.0, 1.0, 1.0, 1.0, 1.0]
}

df = pd.DataFrame(data)

# Create a dictionary to map OutcomeLabel to its opposite
opposite_outcome_label = {
    'Higher than 1.5': 'Lower than 1.5',
    'Lower than 1.5': 'Higher than 1.5',
    'Yes': 'No',
    'NO': 'Yes'
}

# Create a dictionary to map Provider to its opposite
opposite_provider = {
    'Agency A': 'Agency B',
    'Agency B': 'Agency A'
}

# Function to get opposite OutcomeLabel
def get_opposite_outcome(row):
    return opposite_outcome_label.get(row['OutcomeLabel'])


# Function to get opposite Provider
def get_opposite_provider(row):
    return opposite_provider.get(row['Provider'])

# Apply the functions to create OppositeOutcome and OppositeProvider columns
df['OppositeOutcome'] = df.apply(get_opposite_outcome, axis=1)
df['OppositeProvider'] = df.apply(get_opposite_provider, axis=1)
Python Pandas DataFrame 数据操作

评论

0赞 OCa 9/6/2023
所以你想按 1) “提供者”等于 2) “投注类型” 相等和 3) “结果标签”相反 - 这可能需要一个字典,以指定什么与什么相反

答:

0赞 Andrej Kesely 9/7/2023 #1

尝试:

opposite_outcome_label = {
    "Higher than 1.5": "Lower than 1.5",
    "Lower than 1.5": "Higher than 1.5",
    "Yes": "No",
    "No": "Yes",
}

(i1, g1), (i2, g2) = df.groupby("Provider")

# swap in case Agency B is first
if i1 == "Agency B":
    i1, g1, i2, g2 = i2, g2, i1, g1

# sort g1 according keys of `opposite_outcome_label`
g1 = g1.sort_values(
    by="OutcomeLabel",
    key=lambda series, l=list(opposite_outcome_label): [l.index(v) for v in series],
)

# sort g2 according values of `opposite_outcome_label`
g2 = g2.sort_values(
    by="OutcomeLabel",
    key=lambda series, l=list(opposite_outcome_label.values()): [
        l.index(v) for v in series
    ],
)

out = pd.concat(
    [g1.reset_index(drop=True), g2.add_prefix("Opposite").reset_index(drop=True)],
    axis=1,
)
print(out)

指纹:

   Provider BettingType     OutcomeLabel  Odds OppositeProvider OppositeBettingType OppositeOutcomeLabel  OppositeOdds
0  Agency A           A  Higher than 1.5   1.3         Agency B                   A       Lower than 1.5           1.8
1  Agency A           A   Lower than 1.5   1.6         Agency B                   A      Higher than 1.5           1.1
2  Agency A           B              Yes   2.3         Agency B                   B                   No           1.3
3  Agency A           B               No   1.2         Agency B                   B                  Yes           1.5