You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重构博彩数据库用于赔率对比:数据表格式转换技术求助

博彩赔率数据格式转换问题

我在副业项目里需要对比两家博彩机构的赔率,但整理成目标格式时卡壳了。

当前数据表结构

ProviderBettingTypeOutcomeLabelOdds
Agency AAHigher than 1.51.3
Agency AALower than 1.51.6
Agency ABYes2.3
Agency ABNo1.2
Agency BAHigher than 1.51.1
Agency BALower than 1.51.8
Agency BBYes1.5
Agency BBNo1.3

目标数据表结构

ProviderBettingTypeOutcomeLabelOddsOppositeProviderOppositeOutcomeLabelOppositeOdds
Agency AAHigher than 1.51.3Agency BLower than 1.51.8
Agency AALower than 1.51.6Agency BHigher than 1.51.1
Agency ABYes2.3Agency BNo1.3
Agency ABNo1.2Agency BYes1.5

转换要求

  • 行数缩减一半,仅保留其中一家机构(如Agency A)的数据作为主行
  • 将对应反向结果的另一家机构赔率信息转为列:OppositeProvider(对应反向机构)、OppositeOutcomeLabel(原结果的反向标签)、OppositeOdds(反向结果的赔率)
  • 需要可扩展的动态解决方案,方便后续新增投注类型或机构

已完成的预处理代码

import pandas as pd

data = {
    'Provider': ['Agency A', 'Agency A', 'Agency A', 'Agency A', 'Agency B', 'Agency B', 'Agency B', 'Agency B'],
    'BettingType': ['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)

# 结果标签反向映射字典
opposite_outcome_label = {
    'Higher than 1.5': 'Lower than 1.5',
    'Lower than 1.5': 'Higher than 1.5',
    'Yes': 'No',
    'No': 'Yes'  # 修正大小写,匹配数据字段
}

# 机构反向映射字典
opposite_provider = {
    'Agency A': 'Agency B',
    'Agency B': 'Agency A'
}

# 生成反向结果和反向机构列
df['OppositeOutcomeLabel'] = df['OutcomeLabel'].map(opposite_outcome_label)
df['OppositeProvider'] = df['Provider'].map(opposite_provider)

解决方案:动态关联反向数据

通过Pandas的**合并(merge)**操作关联原数据与反向数据,即可完成格式转换:

# 创建反向数据临时表,用于关联匹配
opposite_df = df[['Provider', 'BettingType', 'OutcomeLabel', 'Odds']].rename(
    columns={
        'Provider': 'OppositeProvider',
        'OutcomeLabel': 'OppositeOutcomeLabel',
        'Odds': 'OppositeOdds'
    }
)

# 合并原表与反向表,关联条件:投注类型一致、反向机构匹配、反向结果标签匹配
final_df = pd.merge(
    df,
    opposite_df,
    on=['BettingType', 'OppositeProvider', 'OppositeOutcomeLabel'],
    how='left'
)

# 筛选保留Agency A的主数据,整理目标列顺序
final_df = final_df[final_df['Provider'] == 'Agency A'][
    ['Provider', 'BettingType', 'OutcomeLabel', 'Odds', 'OppositeProvider', 'OppositeOutcomeLabel', 'OppositeOdds']
]

print(final_df)

方案优势

  1. 动态可扩展:新增投注类型或机构时,仅需更新opposite_outcome_label和opposite_provider字典,无需修改核心逻辑
  2. 高效性能:用merge替代循环/apply,处理大数据量时速度更快
  3. 容错性强:通过明确的关联条件匹配数据,避免手动映射出错

运行后输出结果完全符合目标格式:

Provider BettingType     OutcomeLabel  Odds OppositeProvider OppositeOutcomeLabel  OppositeOdds
0  Agency A           A  Higher than 1.5   2.0        Agency B   Lower than 1.5           1.0
1  Agency A           A  Lower than 1.5   3.0        Agency B   Higher than 1.5           1.0
2  Agency A           B              Yes   1.5        Agency B   No                      1.0
3  Agency A           B               No   2.0        Agency B   Yes                     1.0

内容的提问来源于stack exchange,提问作者DataDude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:10:25