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

如何遍历列表用df.loc提取DataFrame数值直至成功或遍历结束?

基于df.loc的DataFrame数据提取方案

需求概述

  • 用df.loc查找目标值,若成功获取有效数值则赋值给变量
  • 若查找过程报错,依次尝试列表中的下一个关键词
  • 所有关键词均尝试失败时,变量设为0

初始代码实现

revenue_list = ['Revenues', 'RevenueFromContractWithCustomerExcludingAssessedTax', 'TotalRevenues']

for i in revenue_list:
  revenue_list = (0 if len(df.loc[[i]].sort_values(['fp', 'end'], ascending=[True, False]).iloc[0]['val'])==0 
                     else df.loc[[i]].sort_values(['fp', 'end'], ascending=[True, False]).iloc[0]['val'])
  if revenue_list != 0:
    break;

示例DataFrame

{'accn': {'RevenueFromContractWithCustomerExcludingAssessedTax': '0001783879-21-000029'},
 'cik': {'RevenueFromContractWithCustomerExcludingAssessedTax': '1783879'},
 'end': {'RevenueFromContractWithCustomerExcludingAssessedTax': datetime.date(2020, 6, 30)},
 'enddate_minus_startdate': {'RevenueFromContractWithCustomerExcludingAssessedTax': 181.0},
 'filed': {'RevenueFromContractWithCustomerExcludingAssessedTax': '2021-08-18'},
 'form': {'RevenueFromContractWithCustomerExcludingAssessedTax': '10-Q'},
 'fp': {'RevenueFromContractWithCustomerExcludingAssessedTax': 'Q2'},
 'frame': {'RevenueFromContractWithCustomerExcludingAssessedTax': nan},
 'fy': {'RevenueFromContractWithCustomerExcludingAssessedTax': 2021},
 'start': {'RevenueFromContractWithCustomerExcludingAssessedTax': datetime.date(2020, 1, 1)},
 'ticker': {'RevenueFromContractWithCustomerExcludingAssessedTax': 'hood'},
 'val': {'RevenueFromContractWithCustomerExcludingAssessedTax': 283044000.0}}

代码优化说明

初始代码存在两处问题:

  1. 变量名重复使用revenue_list,会覆盖原关键词列表,导致循环提前终止或出错
  2. 仅判断结果长度是否为0,未处理df.loc查找失败抛出的KeyError(关键词不存在)、IndexError(排序后无数据)等异常,无法实现“报错则尝试下一项”的逻辑

修正后的代码如下:

import pandas as pd

revenue_keys = ['Revenues', 'RevenueFromContractWithCustomerExcludingAssessedTax', 'TotalRevenues']
revenue = 0  # 默认值设为0

for key in revenue_keys:
    try:
        # 定位关键词对应的行,按fp升序、end降序排序后取第一行
        target_row = df.loc[[key]].sort_values(['fp', 'end'], ascending=[True, False]).iloc[0]
        # 校验val是否为有效数值(非空、非NaN)
        if pd.notna(target_row['val']):
            revenue = target_row['val']
            break  # 获取到有效数值后跳出循环
    except (KeyError, IndexError):
        # 捕获查找或索引异常,继续尝试下一个关键词
        continue

这个版本通过异常处理覆盖了“查找失败报错”的场景,同时避免了变量名冲突,逻辑更贴合需求。

内容的提问来源于stack exchange,提问作者Katsu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:19:23