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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:32:56