重构博彩数据库用于赔率对比:数据表格式转换技术求助
博彩赔率数据格式转换问题
我在副业项目里需要对比两家博彩机构的赔率,但整理成目标格式时卡壳了。
当前数据表结构
| Provider | BettingType | OutcomeLabel | Odds |
|---|---|---|---|
| Agency A | A | Higher than 1.5 | 1.3 |
| Agency A | A | Lower than 1.5 | 1.6 |
| Agency A | B | Yes | 2.3 |
| Agency A | B | No | 1.2 |
| Agency B | A | Higher than 1.5 | 1.1 |
| Agency B | A | Lower than 1.5 | 1.8 |
| Agency B | B | Yes | 1.5 |
| Agency B | B | No | 1.3 |
目标数据表结构
| Provider | BettingType | OutcomeLabel | Odds | OppositeProvider | OppositeOutcomeLabel | OppositeOdds |
|---|---|---|---|---|---|---|
| Agency A | A | Higher than 1.5 | 1.3 | Agency B | Lower than 1.5 | 1.8 |
| Agency A | A | Lower than 1.5 | 1.6 | Agency B | Higher than 1.5 | 1.1 |
| Agency A | B | Yes | 2.3 | Agency B | No | 1.3 |
| Agency A | B | No | 1.2 | Agency B | Yes | 1.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)
方案优势
- 动态可扩展:新增投注类型或机构时,仅需更新
opposite_outcome_label和opposite_provider字典,无需修改核心逻辑 - 高效性能:用
merge替代循环/apply,处理大数据量时速度更快 - 容错性强:通过明确的关联条件匹配数据,避免手动映射出错
运行后输出结果完全符合目标格式:
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
相关产品推荐
相关产品推荐

