求助: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
相关产品推荐
相关产品推荐

