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

求助:Pandas处理DataFrame的betOffers列提取赔率返回空值

解决Pandas提取博彩API中betOffers列赔率的问题

问题根源

你用str.split('odds')返回空值,是因为df['betOffers']列的元素不是字符串,而是嵌套的列表+字典结构(每个元素是包含多个投注项的列表,每个投注项里又嵌套了市场、结果和赔率的字典)。str.split()是针对字符串的方法,对非字符串类型的元素直接返回空值。

解决方案

下面提供两种实用的提取方式,根据你的需求选择:

方式一:多层展开嵌套结构(推荐,保留完整关联信息)

通过pd.json_normalize逐层展开events、betOffers、markets、outcomes,把比赛名称、投注市场、结果选项和赔率一一对应,方便后续分析:

import pandas as pd
import requests

api = 'https://eu-offering-api.kambicdn.com/offering/v2018/betcitynl/listView/table_tennis/czech_republic/czech_liga_pro/all/matches.json?lang=nl_NL&market=NL&client_id=2&channel_id=1&ncid=1711057956050&category=20141&useCombined=true&useCombinedLive=true'
response = requests.get(api)
responseData = response.json()

# 第一步:展开events到betOffers层级
df_events = pd.json_normalize(
    responseData, 
    record_path='events', 
    meta=['id', 'name'], 
    record_prefix='betOffer_'
)

# 第二步:展开betOffers到markets层级
df_markets = pd.json_normalize(
    df_events.to_dict('records'), 
    record_path='betOffer_markets', 
    meta=['id', 'name', 'betOffer_id'], 
    record_prefix='market_'
)

# 第三步:展开markets到outcomes层级(包含赔率数据)
df_odds = pd.json_normalize(
    df_markets.to_dict('records'), 
    record_path='market_outcomes', 
    meta=['id', 'name', 'betOffer_id', 'market_id', 'market_name'], 
    record_prefix='outcome_'
)

# 筛选需要的字段并保存
result_df = df_odds[['name', 'market_name', 'outcome_name', 'outcome_odds']]
result_df.to_csv('betcity.csv', index=False)

方式二:提取单场比赛的所有赔率列表

如果只需要把每场比赛的所有赔率汇总成一个列表,用apply遍历每个元素提取:

import pandas as pd
import requests

api = 'https://eu-offering-api.kambicdn.com/offering/v2018/betcitynl/listView/table_tennis/czech_republic/czech_liga_pro/all/matches.json?lang=nl_NL&market=NL&client_id=2&channel_id=1&ncid=1711057956050&category=20141&useCombined=true&useCombinedLive=true'
response = requests.get(api)
responseData = response.json()

df = pd.json_normalize(responseData, 'events')

# 定义函数提取单场比赛的所有赔率
def extract_odds(bet_offers):
    odds_list = []
    for offer in bet_offers:
        for market in offer.get('markets', []):
            for outcome in market.get('outcomes', []):
                odds_list.append(outcome.get('odds'))
    return odds_list

# 应用函数到betOffers列
df['all_odds'] = df['betOffers'].apply(extract_odds)

# 保存比赛名称和对应的赔率列表
df[['name', 'all_odds']].to_csv('betcity.csv', index=False)

内容的提问来源于stack exchange,提问作者nijhof.ngsvn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:56:21