如何遍历列表用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}}
代码优化说明
初始代码存在两处问题:
- 变量名重复使用
revenue_list,会覆盖原关键词列表,导致循环提前终止或出错 - 仅判断结果长度是否为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
相关产品推荐
相关产品推荐

