如何让DataFrame导出含缺失数据的行至CSV而非整行跳过?
解决方案:保留部分缺失字段的股票数据写入CSV
原代码的问题在于直接通过硬索引访问嵌套字典的字段,一旦某个层级的键不存在或值为空,会直接抛出异常,触发try-except的continue逻辑导致整行数据被跳过。要实现保留可用数据,核心是安全获取每个字段的值,避免单个字段缺失引发全局异常,具体修改如下:
修改后的代码
import pandas as pd from yahooquery import Ticker symbols = ['AI', 'AG', 'MA'] modules = 'financialData defaultKeyStatistics price summaryDetail earningsTrend' # 定义要提取的字段映射,方便统一处理 field_mappings = [ ('symbol', lambda ticker, data: ticker), ('financialCurrency', lambda ticker, data: data.get('financialData', {}).get('financialCurrency')), ('shortRatio', lambda ticker, data: data.get('defaultKeyStatistics', {}).get('shortRatio')), ('shortPercentOfFloat', lambda ticker, data: data.get('defaultKeyStatistics', {}).get('shortPercentOfFloat')), ('priceToBook', lambda ticker, data: data.get('defaultKeyStatistics', {}).get('priceToBook')), ('earningsQuarterlyGrowth', lambda ticker, data: data.get('defaultKeyStatistics', {}).get('earningsQuarterlyGrowth')), ('marketCap', lambda ticker, data: data.get('price', {}).get('marketCap')), ('shortName', lambda ticker, data: data.get('price', {}).get('shortName')), ('fiftyTwoWeekLow', lambda ticker, data: data.get('summaryDetail', {}).get('fiftyTwoWeekLow')), ('fiftyTwoWeekHigh', lambda ticker, data: data.get('summaryDetail', {}).get('fiftyTwoWeekHigh')), ('growth', lambda ticker, data: data.get('earningsTrend', {}).get('trend', [{}])[-1].get('growth')) ] # 初始化总数据列表,用于收集所有股票数据 all_data = [] for tick in symbols: tickers = Ticker(tick) try: # 获取模块数据 ticker_data = tickers.get_modules(modules) for ticker, data in ticker_data.items(): # 逐个字段安全提取值 row = {} for field_name, extract_func in field_mappings: row[field_name] = extract_func(ticker, data) all_data.append(row) except Exception as e: # 仅记录完全无法获取数据的异常,不跳过部分缺失字段的情况 print(f"处理股票 {tick} 时发生异常: {str(e)}") continue # 将所有数据转为DataFrame并写入CSV if all_data: df = pd.DataFrame(all_data) df.to_csv('output.csv', index=False)
关键修改说明
- 安全字段提取:使用字典的
get()方法替代硬索引,data.get('xxx', {})确保即使父级键不存在,也返回空字典而非抛出KeyError;对于earningsTrend.trend这种列表型字段,用get('trend', [{}])处理空列表的情况,避免索引越界。 - 统一字段映射:把字段提取逻辑封装到列表中,便于维护和扩展,每个字段对应一个提取函数,清晰处理不同层级的数据结构。
- 批量收集数据:先把所有股票数据收集到列表中,最后一次性写入CSV,避免多次追加文件的效率问题,同时保证表头只写入一次。
- 异常范围缩小:仅在完全无法获取股票模块数据时才跳过该股票,单个字段缺失不会触发跳过逻辑,而是将对应字段设为
None(写入CSV时显示为空)。
内容的提问来源于stack exchange,提问作者HTMLHelpMe
相关产品推荐
相关产品推荐

